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

时间:2013-02-23 21:09:38

标签: javascript variables namespaces global-variables

我的代码向上或向下递增一个数字。问题是“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 个答案:

答案 0 :(得分:3)

数字按值传递,而不是参考,因此您可以执行您要执行的操作。如果你的代码按照它的方式构建,你需要像这样分配返回值:

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

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

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


或者,由于您已经在使用全局变量,因此您可以直接修改全局变量,甚至不将其作为参数传递。作为参数的传递是复制它,所以你不能修改原文。通常不建议使用全局变量,但如果由于其他原因它已经是全局变量,则可以直接在函数中修改它而不将其作为参数传递。

答案 1 :(得分:0)

您正在使用“variable ++”和“variable--”,它正在递增或递减本地范围的变量(函数范围的本地)。该参数不是指向全局变量的指针,它是通过值(而不是通过引用)传递的。

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

答案 2 :(得分:0)

function makeButtonIncrement(button, upDown, displayDiv) {

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

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

        displayDiv.innerHTML = testNum;
    }

    button.onclick = changeValue;
}