3

これは非常に単純なことだと思いますが、これを正しく機能させることができないようです。これが私のコードです:

var zero = 10;

function some(elem, num) {
    return elem += num;
}

console.log(some(zero, 10));
console.log(some(zero, 10));
console.log(some(zero, 10));

私が理解していることから、変数inはzero毎回10ずつ増えると予想していました。つまり、10、20、30になります。代わりに、10を取得し続けます。明らかに、これは正しくありません。

私の質問は、変数zeroを毎回10ずつ増やし、その値を変数に保存するにはどうすればよいzeroですか?

4

5 に答える 5

9

JavaScriptは値を渡すため、渡された値を変更しても呼び出し元の変数には影響しません。戻り値を使用する必要があります。

var zero = 10;

function sum(elem, num) {
    return elem + num;
}

console.log(zero = sum(zero, 10));
console.log(zero = sum(zero, 10));
console.log(zero = sum(zero, 10));
于 2012-12-08T16:33:55.037 に答える
4

あなたがするとき

elem += num

...関数では、引数の値が由来する変数ではなくelem、関数に渡された引数によって保持されている値をインクリメントしています。引数と変数の間にリンクはありません。の呼び出しの時点でのは、関数に渡されます。elemzerozerosome

于 2012-12-08T16:34:11.390 に答える
2

数値などのプリミティブは、参照ではなく値で渡されます。elemこれは、ローカル変数ではなく、ローカル変数をインクリメントすることを意味しますzerozeroしたがって、関数を呼び出すたびに、関数の外部で再割り当てする必要があります。

console.log(zero = some(zero, 10));

または、ゼロをオブジェクトのプロパティにし、オブジェクトを渡します。オブジェクトは、値ではなく参照によって渡されます。したがって、たとえば:

var zero = [10]

function some(elem, num) {
    return elem[0] += num;
}

console.log(some(zero, 10));
console.log(some(zero, 10));
console.log(some(zero, 10));

これは、zeronowsがプリミティブではなく配列であり、配列がオブジェクトであるため、参照によって渡されるためです。

于 2012-12-08T16:59:38.473 に答える
2

これを試して:

sum = (function sum(num){
    var zero = 0;
    return function () {
        return zero += num;
    };

})(10);

console.log(sum());
console.log(sum());
console.log(sum());
于 2012-12-09T18:51:18.340 に答える
0

zero = some(zero, 10)

some()で新しい値を返します。したがって、関数呼び出しの後でゼロに割り当てる必要があります。

于 2012-12-08T16:34:38.980 に答える