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的例子显示。