繁体   English   中英

JavaScript 和匿名函数中的闭包细节

[英]specifics of closures in JavaScript and anonymous functions

此代码导致"!" 正在登录控制台。

var g = {};
(function() {
    var t = this;
    t.x = "x";
    g.a = function() {
        console.log(t.x);
    };
})();

(function() {
    var t = this;
    t.x = "!";
    g.b = function() {
        console.log(t.x);
    };
})();

g.a();

匿名函数是否共享this this错了吗? 我真的不明白这里发生了什么。

我希望ga()继续返回在第一个匿名 function 中定义的x的值。

如果它有所作为,我正在使用 node.js。

在立即函数中, this指的是全局 object [docs] 因此,在这种情况下,在这两个函数中, this确实指的是同一个元素,并且您正在用第二次调用覆盖x

this指的object是由function的调用方式决定的。

  • 如果你只是用funcName(); ,那么this指的是全局 object
  • 如果将 function 分配给 object 的属性obj.funcName()this指的是 object。
  • 如果您使用new运算符调用 function,则new funcName(); this是指从函数原型继承的空 object。

您还可以使用call [docs]apply [docs]显式设置this


而不是参考this ,您可以在两个函数中创建一个新的 object :

var t = {};

附加说明:无论您是在浏览器中运行代码还是使用 node.js 运行代码都没有区别。 全局 object 是规范的一部分,必须由执行环境提供。 在浏览器中它是window object,我不知道它在 node.js 中是什么,但只要遵循规范就可以了。

Felix Kling 是正确的长答案。 但我想加入我认为你真正想要的东西:

var g = {};
(function() {
    var x = "x";
    g.a = function() {
        console.log(x);
    };
})();

(function() {
    var x = "!";
    g.b = function() {
        console.log(x);
    };
})();

g.a(); // "x"
g.b(); // "!"

现在ga()gb()都打印出x ,但是每个 function 都有自己单独的x与闭包共享。 如果这些变量应该是私有的,并且只能在这些函数内部访问,那么这就是隐藏它们并通过多次调用持久化它们的方式。

当我在 Chrome 的调试器中查看这个脚本时,两个匿名函数中的“this”值都设置为全局变量“window”。 这意味着每个匿名 function 都在设置window.x的值,所以最后一个执行的获胜并且是幸存的值,因此window.x == "!" 在第二个匿名 function 执行之后。

我不清楚你期望“this”是什么,或者你实际上试图用这段代码完成什么,所以我不知道有什么替代建议。 如果您只希望匿名 function 中的先前 state 能够在内部 function 中存在,那么您可以只依赖局部变量(“this”引用将在“闭包”中完全不存在)。 Squeegy 的例子表明了这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM