我有一个变量,其值部分由另一个变量定义。我想更改该变量的值,以便初始变量也发生变化。但这并没有发生。看第二行:
var offset = 0;
var message = 'the number is ' + offset;
如果我修改"偏移" ,然后"消息"不会改变:
console.log(message); //this says 'the number is 0'
offset +=20; //offset is changed to 20
console.log(message); //the message is still 'the number is 0'
为什么它不起作用,我将如何解决它?
答案 0 :(得分:1)
在两种情况下都会显示0
,因为在您设置时,offset
值为0,这是message
变量将保存的信息强>直到你改变它的价值。
var offset = 0;
var message = 'the number is ' + offset;
console.log(message);
offset += 20;
console.log(message);
您必须将offset
变量重新分配(刷新)到message
变量才能使更改可见。
var offset = 0;
var message = 'the number is ' + offset;
console.log(message);
offset += 20;
message = 'the number is ' + offset;
console.log(message);
答案 1 :(得分:1)
表达式'the number is' + offset
仅评估一次。更新offset
的次数并不重要,JavaScript无法跟踪message
和offset
之间的任何关系,它们是两个独立的变量。
如建议的那样,您可以使用函数来表示消息而不是变量。
var offset = 0;
function message() {
return 'the number is ' + offset;
}
console.log(message());
offset += 20;
console.log(message());

这样,每次都会重新计算邮件。
答案 2 :(得分:1)
为什么不起作用
当您执行'the number is ' + offset
时,会读取offset
的值,然后在那里创建一个新值,即'the number is 20'
,分配给message
。新值不“知道”它是如何创建的,因此无法重新计算自身。这根本不是JavaScript的工作方式。
我想更改该变量的值,以便初始变量也会发生变化。
使用变量是不可能的。但是你可以使用带有getter的对象来实现类似的效果:
var obj = {
offset: 0,
get message() {
return 'the number is ' + this.offset;
},
};
console.log(obj.message);
obj.offset += 20;
console.log(obj.message);
(注意:没有必要使用getter,你也可以创建一个普通的方法/函数并将其称为obj.message()
)
答案 3 :(得分:1)
它只是一个简单的任务,当程序流程达到它时,将"the number is"
连接到偏移值&继续走向计划结束的下一行。
这是Javascript的本质,原始类型(Number,String等)按值传递。因此,offset
中的更改不会反映在message
。
变量不“保持”对象,它包含引用。您可以将该引用分配给另一个变量,现在它们都引用同一个对象。它总是按值传递(即使该值是参考值......)。 没有办法改变作为参数传递的变量所持有的值,如果JS支持通过引用传递,那么这是可能的。From Here
为了具有始终相关的消息值,您可以将其定义为函数:
var offset = 0;
var message = function(){
return('the number is ' + offset);
}
console.log(message()); //this says 'the number is 0'
offset +=20; //offset is changed to 20
console.log(message()); //this says 'the number is 20'