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>
4

3 に答える 3

3

数値は参照ではなく値で渡されるため、実行しようとしていることを実行できます。コードがこのように構造化されている場合、戻り値を割り当てる場合は、次のようにする必要があります。

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

配列とオブジェクトのみが参照によって渡されるため、引数として渡され、関数に元の変数を変更させることができます。他のタイプは値によって渡されるため(たとえば、引数のコピーが作成される)、元のタイプを変更することはできません。

オリジナルを変更する回避策は、それをオブジェクトのプロパティとして渡すことです。次に、オブジェクトは参照によって渡されるため、関数は元のプロパティ値を変更できます。


または、すでにグローバル変数を使用しているため、グローバル変数を直接変更するだけで、引数として渡すこともできません。元のファイルを変更できないようにコピーを作成するのは、引数として渡すことです。一般に、グローバル変数は推奨されませんが、他の理由ですでにグローバルになっている場合は、引数として渡さずに関数で直接変更できます。

于 2013-02-23T21:17:24.360 に答える
0
function makeButtonIncrement(button, upDown, displayDiv) {

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

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

        displayDiv.innerHTML = testNum;
    }

    button.onclick = changeValue;
}
于 2013-02-23T21:24:10.973 に答える
0

ローカルスコープの変数(関数スコープに対してローカル)をインクリメントまたはデクリメントする「variable++」と「variable--」を使用しています。パラメータはグローバル変数へのポインタではなく、値によって渡されます(参照ではありません)。

最も簡単な変更は、とをそれぞれに変更variable++し、variable--不要testNum++testNum--ためにその最終的な関数パラメーターを削除することです。

于 2013-02-23T21:18:07.347 に答える