1

不确定这是否是表达我的问题的正确方法。如果我设置以下一段 JavaScript 代码:

var x = 5;
var y = function(z) {
    z=7;
    return z;
}
y(x);
x;

7从函数调用中返回,但x保持其原始值。我认为 JavaScript 变量是通过引用调用的,那么为什么它x的值实际上并没有通过函数改变?

4

2 回答 2

3

这里真正的问题是你没有改变任何东西。您只是z在函数中重新分配变量。如果你传递一个对象或数组,它不会有什么不同。

var x = ['test'];
var y = function(z) {
    z=['foo'];
    return z;
}
y(x);
x; // Still ['test']

现在,别人说的也是真的。基元不能被变异。这实际上比听起来更有趣,因为以下代码有效:

> var x = 1;
> x.foo = 'bar';
"bar"
> x
1
> x.foo
undefined

请注意,分配给x.foo看似成功,但x.foo无处可寻。这是因为 JavaScript 很容易强制原始类型和对象类型(有原始的“对象”版本,即普通对象)。在这种情况下,原语被强制1转换为一个新对象(new Number(1)foo

于 2013-07-15T16:46:59.070 回答
2

感谢@TeddHopp 关于此说明:

只为所有变量传递值,而不仅仅是原语。您不能通过将调用代码中的变量传递给函数来更改它。(当然,您可以更改可能传递的对象或数组;但是,变量本身在调用代码中保持不变。)

如果你想x改变的值无论如何你可以这样做:

x = y(x);
于 2013-07-15T16:45:15.257 回答