2013-02-23 94 views
0

我的代碼將數字向上或向下遞增1.問題是「testNum」是一個全局變量,它應該反映向上或向下的增量,但是當我檢查在控制檯中的「testNum」值始終爲20.我將「testNum」傳遞給我的函數並返回它。爲什麼它不反映增量?將全局變量傳遞給函數 - 全局變量在函數運行後不更新

小提琴:http://jsfiddle.net/FnUXw/1/

<input type="button" id="btnDown" value="-"> 
<span id="amountDiv">amount div</span> 
<input type="button" id="btnUp" value="+"> 

<script> 
var testNum = 20; 

amountDiv.innerHTML = testNum; 

function makeButtonIncrement(button, upDown, displayDiv, variable) { 

    function changeValue() { 
     if (upDown == "up") { 
      variable++; 
     } 

     if (upDown == "down") { 
      variable--; 
     } 

     displayDiv.innerHTML = variable; 
    } 

    button.onclick = changeValue; 

    return variable; 
} 

makeButtonIncrement(document.getElementById('btnDown'), "down", document.getElementById('amountDiv'), testNum); 

makeButtonIncrement(document.getElementById('btnUp'), "up", document.getElementById('amountDiv'), testNum); 
</script> 
+3

[JavaScript通過值傳遞基元,而不是通過引用](http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-語言)。 – DCoder 2013-02-23 21:15:14

+0

你爲什麼要傳遞變量,如果它是一個全局變量 – 2013-02-23 21:16:45

+0

@ParvSharma我想在整個我的代碼中使用這個函數和不同的按鈕和變量。 – user1822824 2013-02-23 21:18:52

回答

3

數字是按值傳遞,不是引用所以你可以做你想做什麼。與您的代碼結構的事情是這樣的,你需要做這樣的,你指定的返回值:

testNum = makeButtonIncrement(document.getElementById('btnDown'), "down", document.getElementById('amountDiv'), testNum); 

只有數組和對象按引用傳遞這樣他們就可以作爲參數傳遞,並有功能修改原始變量。其他類型按值傳遞(例如爲參數進行復制),因此您無法修改原始文件。

修改原始的解決方法是將其作爲對象的屬性傳遞。然後,因爲該對象通過引用傳遞,函數可以修改原始屬性值。或者,由於您已經在使用全局變量,因此您可以直接修改全局變量,甚至不將其作爲參數傳遞。這是通過作爲參數,使它的副本,所以你不能修改原件。通常不建議使用全局變量,但如果由於其他原因已經是全局變量,則可以直接在函數中對其進行修改而不將其作爲參數傳遞。

+0

我認爲正確的名詞是「pass by object」 – 2013-02-23 21:20:13

+0

@JanDvorak - 正確的用語是什麼? – jfriend00 2013-02-23 21:20:52

+0

因爲這是傳遞的值是原始值或對象引用 – 2013-02-23 21:21:46

0

您正在使用「變量++」和「變量 - 」,它正在遞增或遞減該局部範圍變量(局部於函數範圍)。該參數不是指向全局變量的指針,而是通過值傳遞(而不是通過引用)。

最簡單的修改是將分別改變variable++variable--testNum++testNum--和並移除最終功能參數,因爲它是不必要的。

0
function makeButtonIncrement(button, upDown, displayDiv) { 

    function changeValue() { 
     if (upDown == "up") { 
      testNum++; 
     } 

     if (upDown == "down") { 
      testNum--; 
     } 

     displayDiv.innerHTML = testNum; 
    } 

    button.onclick = changeValue; 
}