JavaScript函数参数按引用存储

时间:2013-07-15 16:43:49

标签: javascript

不确定这是否是提出问题的正确方法。如果我设置了以下JavaScript代码:

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

我从函数调用返回7,但x保持原始值。我认为JavaScript变量是通过引用调用的,那么x的值是如何通过函数实际更改的呢?

2 个答案:

答案 0 :(得分: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属性已设置,然后立即销毁,因此不会产生持久影响。

答案 1 :(得分:2)

感谢@TeddHopp关于这个说明:

  

仅为所有变量传递值,而不仅仅是基元。您   无法通过将调用传递给a来更改调用代码中的变量   功能。 (当然,您可以更改可能的对象或阵列   通过;但是,变量本身在调用中保持不变   代码。)

如果您希望x的值能够改变,您可以这样做:

x = y(x);