JavaScript和匿名函数中的闭包细节
此代码导致"!"
正在login控制台。
var g = {}; (function() { var t = this; tx = "x"; ga = function() { console.log(tx); }; })(); (function() { var t = this; tx = "!"; gb = function() { console.log(tx); }; })(); ga();
匿名函数是否共享this
? 我使用this
错误? 我真的不明白这里发生了什么事。
我希望ga()
继续返回第一个匿名函数中定义的x
的值。
我使用node.js,如果它有所作为。
在即时函数中, this
是指全局对象 [docs] 。 所以在这种情况下,在这两个函数中, this
实际上指的是相同的元素,你用第二次调用覆盖x
。
this
引用的对象是由函数的调用方式决定的。
- 如果你只是用
funcName();
执行一个函数funcName();
那么this
是指全局对象 。 - 如果该函数被分配给一个对象的属性
obj.funcName()
,那么this
对象就是对象。 - 如果使用
new
运算符调用函数,则new funcName();
,this
是指从函数原型inheritance的空对象。
您也可以使用call
[docs]或apply
[docs]来明确设置。
相反,引用this
,你可以在两个函数中创build一个新的对象:
var t = {};
附加说明:无论您是在浏览器中还是使用node.js运行代码,都没有区别。 全局对象是规范的一部分,必须由执行环境提供。 在浏览器中,它是window
对象,我不是什么在node.js中,但只要遵循规范就没有关系。
费利克斯·克林是正确的答案。 但我想和我想你真正想要的东西吻合:
var g = {}; (function() { var x = "x"; ga = function() { console.log(x); }; })(); (function() { var x = "!"; gb = function() { console.log(x); }; })(); ga(); // "x" gb(); // "!"
现在ga()
和gb()
都打印出来了,但是每个函数都有自己单独的x
与闭包共享。 如果这些variables应该是私人的,只能在这些函数的内部进行访问,这就是你如何隐藏它们并通过多次调用来坚持它们。
当我在Chrome中的debugging器中查看这个脚本时,这两个匿名函数中的“this”值被设置为全局variables“window”。 这意味着每个匿名函数都设置了window.x
的值,所以最后一个执行的是wins并且是存活的值,因此window.x == "!"
在第二个匿名函数执行之后。
目前还不清楚你期望“这个”是什么,或者你真的想用这个代码来完成什么,所以我不知道有什么替代scheme。 如果你只是想让匿名函数中的前一个状态在内部函数中生存下来,那么你可以只依靠局部variables(它将在闭包中存活),而不是使用“this”引用。 Squeegy的例子显示。