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));

据我了解,我期望变量 inzero每次增加 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...在您的函数中,您正在递增传递给函数的参数所持有的值,而不是参数值来自的变量。elem参数和变量之间没有联系,在调用 时,zero被传递到函数中。zerosome

于 2012-12-08T16:34:11.390 回答
2

像数字这样的原语是按值而不是按引用传递的。这意味着您增加局部elem变量,而不是zero那些。因此,您需要 - 在函数之外 -zero在每次调用函数后重新分配:

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 回答