2013-02-23 95 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; 
}