【发布时间】:2014-03-21 23:07:40
【问题描述】:
我是 JavaScript 新手(虽然在 C++ 方面有经验),今天我写了这样的东西:
function foo(bar) {
bar = "something else";
}
var x = "blah";
foo(x);
alert(x); // Alerts with "blah", but I was expecting it to alert with "something else"
这让我很困惑,因为我一直在观看 Douglas Crockford 的一些 JavaScript 视频,记得他说过“JavaScript 总是通过引用传递”之类的话。
我可以解释这种情况的方式是 JavaScript 传递对对象的引用,但这些引用被复制了。这意味着在foo 函数中,我为bar 分配了一个新引用,然后它超出了范围,留下引用x 保持不变。基本上我们从:
x ---->"blah"
那么当foo被调用时,bar引用相同的数据:
x ---->"blah"
bar -----^
所以当“别的东西”被分配给bar时,就会发生这种情况:
x ---->"blah"
bar ---->"something else"
这是 JavaScript 中实际发生的事情的准确模型,还是我遗漏了其他东西?
作为一个额外的问题,有没有办法说,改变这个变量引用的数据?这是经常出现的情况,还是可以轻松避免的?
编辑:
Douglas Crockford 在video I watched 中说“对象总是通过引用传递,而不是通过值传递”,这是正确的,但是函数的参数是通过值传递的,只是引用是通过值传递的。
【问题讨论】:
-
可能你看错了视频。 JavaScript 始终是按值传递的。即使这些值是对对象的引用。
-
@Bergi - 我在我记得的视频中添加了一个链接。我误解了它,请参阅我的编辑
标签: javascript pass-by-reference pass-by-value