我怎么能在匿名自执行函数中向闭包添加属性?

时间:2012-03-25 16:50:51

标签: javascript

为什么当我这样做时:

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没有?

2 个答案:

答案 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的值保持不变(对象的引用)。