如何在匿名自执行函数中为闭包添加属性
How is it that I can add properties to a closure in anonymous self executing function?
为什么当我这样做时:
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
没有?
您可以对任何其他函数执行相同的操作:
var o = {};
function f(x) {
x.val = "foo";
}
f(o);
console.log(o.val);
对象浮动在堆上的某个位置,两个x
都只是对该对象的引用。你只需要一个对它的引用就可以改变一个对象,不管你是如何得到这个引用的。
另一方面,语句x = ...;
只是覆盖局部变量以引用其他内容。这也是为什么JS的没有具有传统(更有用)定义的"引用传递"。
在这两个函数中,都有一个全局x(在第一行)和一个局部x(function bla(x){
)。
在第一个示例中,您只是在更改一系列变量的值。更改局部x的值不会影响全局x。
在第二个示例中,您将对您创建的对象的引用传递给函数,而不是它的副本。在函数中,您通过为对象的一个属性分配一个新值来修改该对象。全局和局部x的值保持不变(对对象的引用)。
相关文章:
- 在underscorejs模板中使用闭包
- setTimeout可以与闭包内的函数一起使用吗
- 附加到原型属性的Do函数没有闭包
- 使用闭包共享构造函数参数
- 使用Google闭包编译器包含一个Ecmascript 6类
- 用于添加两个数字的javascript闭包的用法
- 我可以使用JavaScript闭包添加数字吗
- 如何将点击事件克隆并添加为单独的元素 - 没有闭包
- 使用 Google 闭包将 json 响应内容作为链接添加到对话框中
- 为什么Google闭包编译器在原始命名空间为空的情况下向全局命名空间添加变量
- 如何在匿名自执行函数中为闭包添加属性
- 使用object.assign()添加到对象中的getter发现闭包变量的值错误
- 将变量self而不是this添加到闭包中
- Javascript:在闭包中,私有成员(var)可以在实例化后添加吗
- Javascript:闭包?eventlistener获胜't添加
- 是否可以为闭包编译器添加@language ECMASCRIPT5来注释JavaScript
- 如何在加载后将媒体变量添加到数组时不改变它们.闭包
- 如何在coffeescript中向安全闭包添加实参/形参
- 将变量添加到函数作用域/闭包中.函数相当于窗口对象
- 私有成员(使用闭包),为什么初始化后添加的函数不能访问私有成员?