Javascript - 更改属于另一个变量定义的变量值

时间:2017-03-06 23:56:11

标签: javascript

我有一个变量,其值部分由另一个变量定义。我想更改该变量的值,以便初始变量也发生变化。但这并没有发生。看第二行:

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'

为什么它不起作用,我将如何解决它?

4 个答案:

答案 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无法跟踪messageoffset之间的任何关系,它们是两个独立的变量。

如建议的那样,您可以使用函数来表示消息而不是变量。



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'