为什么当我这样做时:
x = 5
(function bla(varX){
varX = 7; console.log(x); //7
})(x);
console.log(x); //5
x
没有改变,因为如果我理解正确的话,它会在闭包中,
但在这里:
x = {a:5}
(function bla(varX){
varX.a = 7; console.log(varX.a);
})(x)
console.log(x.a); //7
为什么x.a
被覆盖而x
没有?
答案 0 :(得分:3)
你可以用任何其他功能做同样的事情:
var o = {};
function f(x) {
x.val = "foo";
}
f(o);
console.log(o.val);
对象在堆上的某处浮动,x
只是对该对象的引用。无论您如何获得该参考,您只需要对其进行引用即可更改对象。
另一方面,语句x = ...;
只是覆盖局部变量以引用其他内容。这也是JS为什么不通过传统(更有用)的定义“通过引用传递”的原因。
答案 1 :(得分:0)
在这两个函数中,你有一个全局x(第一行)和一个本地x(function bla(x){
)。
在第一个示例中,您只是更改一系列变量的值。更改本地x的值不会触及全局x。
在第二个示例中,您将对您创建的对象的引用传递给函数,而不是它的副本。在函数中,您修改该对象,方法是为其中一个属性指定一个新值。全局x和局部x的值保持不变(对象的引用)。