2017-03-06 109 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()

相關問題