由於Javascript不支持真正的引用傳遞,您可以在其中更改原始變量,因此無法直接執行所要求的操作。通常的解決方法是將全局包裝在一個對象中。
var myGlobal = {
counter: 0;
};
function increment(obj, prop) {
++obj[prop];
}
increment(myGlobal, "counter");
increment(myGlobal, "counter");
console.log(myGlobal.counter); // 2
或者,如果屬性名稱是已知的,你可以這樣做:
var myGlobal = {
counter: 0;
};
function incrementCnt(obj) {
++obj.counter;
}
incrementCnt(myGlobal);
incrementCnt(myGlobal);
console.log(myGlobal.counter); // 2
這工作,因爲當你傳遞一個對象給一個函數,什麼是傳遞的是一個指向同一對象的指針(該對象不被複制)。因此,如果您修改該對象上的任何屬性,則只有該對象的一個副本,因此您要修改該對象的該副本的屬性,並且引用該對象的每個人都將看到屬性更改。
像數字和布爾值這樣的原始數據按值傳遞,它的工作方式與複製相同,因此原始數據不會受到該函數的影響。
有人能解釋爲什麼number
保持不變,並建議另 的方式來實現我的預期目標?
將數字傳遞給函數時,數字的值被複制到作爲函數參數的新變量中。僅將該參數的值更改爲該函數會影響該參數 - 它根本沒有連接到原始變量。這是因爲在Javascript中,原語是通過值傳遞的,而不是通過引用。所以,沒有任何關於價值來自哪裏的參考。當你在函數中接收它時,它是一個獨立的新變量。
另一種可能的解決辦法是剛剛從你的函數返回修改後的值,並允許呼叫者分配該修改的值到任何他們想要的:
var counter = 0;
function increment(val) {
return val + 10;
}
counter = increment(counter);
console.log(counter); // 10