将全局变量传递给函数-函数运行后全局变量不更新



我的代码将数字向上或向下递增1。问题是"testNum",它是一个全局变量,应该反映向上或向下的增量,但当我在控制台中检查"testNum"的值时,它总是20。我将"testNum"传递给我的函数并返回它。为什么它不反映增量?

Fiddle: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>

数字是通过值传递的,而不是通过引用传递的,所以你不能用这种方式来做你想做的事情。按照代码的结构,您可以这样做,分配返回值:

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

只有数组和对象是通过引用传递的,因此它们可以作为参数传递,并让函数修改原始变量。其他类型是通过值传递的(例如,为参数制作了一个副本),因此您无法修改原始类型。

修改原始对象的方法是将其作为对象的属性传递。然后,因为对象是通过引用传递的,所以函数可以修改原始属性值。


或者,由于您已经在使用全局变量,您可以直接修改全局变量,甚至不将其作为参数传递。正是作为一个参数传递,才生成了它的副本,所以你不能修改原始的。一般来说,不建议使用全局变量,但如果由于其他原因它已经是全局变量,则可以直接在函数中修改它,而不将其作为参数传递。

您使用的是"variable++"one_answers"variable--",即递增或递减本地作用域变量(函数作用域的本地变量)。参数不是指向全局变量的指针,它是通过值传递的(而不是通过引用传递的)。

最简单的修改是将variable++variable--分别更改为testNum++testNum--,并删除最终函数参数,因为这是不必要的。

function makeButtonIncrement(button, upDown, displayDiv) {
    function changeValue () {
        if (upDown == "up") {
            testNum++;
        }
        if (upDown == "down") {
            testNum--;
        }
        displayDiv.innerHTML = testNum;
    }
    button.onclick = changeValue;
}

相关内容

  • 没有找到相关文章

最新更新