我是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 -----^
当"something else"被分配给bar
时,会发生以下情况:
x ---->"blah"
bar ---->"something else"
这是JavaScript中正在发生的准确模型吗?我有没有漏掉其他什么东西?
额外的问题是,有没有办法说“更改此变量引用的数据”?这种情况经常出现吗?还是可以轻松避免?
编辑:
在我观看的视频中,Douglas Crockford说“对象总是通过引用传递,而不是通过值传递”,这是正确的,但是传递给函数的参数是按值传递的,只是引用是按值传递的。