2017-03-06 91 views
0

我有一个变量,其值由另一个变量部分定义。我想更改该变量的值,以使初始变量也发生变化。但是这并没有发生。再看第二行: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' 

为什么它不工作,我将如何解决呢?

+0

这不是变量,我是任何语言是如何工作的意识到。 – bejado

+0

它不起作用,因为JavaScript中的变量(如在大多数语言中)使用急切的赋值而非惰性赋值。为了实现你想要的,你可能需要将消息构造为一个函数。 – Hamms

+0

未定义*,已构建。你有一个变量,其值是部分*建立*与另一个变量。如何解决它?用新值再次构建'message'。而且因为它很烦人,一遍又一遍地写同样的代码,把它放在一个*(模板)*函数中。 – Thomas

回答

1

它只是一个简单的任务,当程序流达到它,串接"the number is"值的偏移 &继续s接近节目结束的下一行。

这是Javascript的本质,原始类型(数字,字符串等)通过值传递。因此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'

+1

*“基本类型(数字,字符串等)是按值传递的。”*在此处谨慎使用术语。 “按值传递”和“按引用传递”通常描述了**变量**(/参数)之间的关系。变量所保存的值的实际“类型”是无关紧要的。您可能会考虑*值类型*(原始)和*引用类型*(对象),但这与“按值传递”无关。请参阅https://en.wikipedia.org/wiki/Evaluation_strategy。但是,报价是正确的。 –

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

表达'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());

这样一来,消息被每次重新计算。

1

为什么它不工作

当你做'the number is ' + offset,读取的offset值当时就创造新的价值,字符串'the number is 20',它被分配到message。新值不会“知道”它是如何创建的,因此不能自行重新计算。这根本不是JavaScript的工作原理。

我想更改该变量的值,以便初始变量也发生变化。

这不可能与变量。但是你可以使用一个对象吸气剂来达到类似的效果:

var obj = { 
 
    offset: 0, 
 
    get message() { 
 
    return 'the number is ' + this.offset; 
 
    }, 
 
}; 
 

 
console.log(obj.message); 
 
obj.offset += 20; 
 
console.log(obj.message);

(注:该吸气剂是没有必要的,你也可以只创建一个普通的方法/功能和呼叫它作为obj.message()

相关问题