簡體   English   中英

將全局變量傳遞給函數-函數運行后全局變量不更新

[英]Passing Global Variable to Function - Global Variable Not Updating After Function Run

我的代碼將數字遞增或遞減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>

數字是通過值傳遞的,而不是作為參考傳遞的,因此您可以執行自己想做的事情。 按照代碼的原樣進行結構化之后,您需要在分配返回值的過程中執行以下操作:

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

只有數組和對象是通過引用傳遞的,因此它們可以作為參數傳遞,並且可以讓函數修改原始變量。 其他類型按值傳遞(例如,為參數創建副本),因此您無法修改原始類型。

修改原始文件的方法是將其作為對象的屬性傳遞。 然后,由於該對象是通過引用傳遞的,因此該函數可以修改原始屬性值。


或者,由於您已經在使用全局變量,因此可以直接修改全局變量,甚至不將其作為參數傳遞。 它是作為參數傳遞的副本,因此您無法修改原始參數。 通常不建議使用全局變量,但是如果由於其他原因它已經是全局變量,則可以直接在函數中對其進行修改,而無需將其作為參數傳遞。

您正在使用“ variable ++”和“ 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM