JavaScript函数参数按引用存储[重复]

Posted

技术标签:

【中文标题】JavaScript函数参数按引用存储[重复]【英文标题】:JavaScript function arguments store by reference [duplicate] 【发布时间】:2013-07-13 14:55:07 【问题描述】:

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

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

y(x);
x;

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

【问题讨论】:

基元按值传递。 ***.com/questions/6605640/… 【参考方案1】:

这里真正的问题是你没有改变任何东西。您只是在函数中重新分配变量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 属性被设置,然后立即销毁,因此不会产生持久效果。

【讨论】:

哦,好的。那么当我在函数中重新分配z 时,zx 不会指向同一个数组/对象吗?我认为这就是通过引用调用的意思。你能帮我理解我没有得到什么吗?再次感谢您的回答! @user2066880 - 它们是同一个对象,直到您在函数内重新分配 z。到那时,您可以使用z 修改对象,这些修改将在调用代码中看到。如果将此代码中的z=['foo']; 替换为z[0] = 'foo';,则调用代码中的x 将更改为['foo']【参考方案2】:

感谢@TeddHopp 关于此说明:

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

如果你想改变x 的值,你可以这样做:

x = y(x);

【讨论】:

只为所有变量传递值,而不仅仅是原语。您不能通过将调用代码中的变量传递给函数来更改它。 (当然,您可以更改可能传递的对象或数组;但是,变量本身在调用代码中保持不变。) 谢谢。你每天学习新的东西。我猜我更习惯 Java :)

以上是关于JavaScript函数参数按引用存储[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Common Lisp:按值传递与按引用传递[重复]

8.引用函数

JavaScript sort函数的使用

JavaScript笔记之数组 keyword(存储和释放&堆栈 & 按值 引用)

js函数中参数的传递

将参数作为接口传递[重复]