[英]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 。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.