我的情况很混乱......
(function sayStuff(){
this.word = "hello2";
(function (){
console.log(this.word);
}())
}())
var myObject = {
word: "bar",
func: function() {
(function() {
console.log(this.word);
}());
}
};
myObject.func();
输出
hello2 hello2
这是怎么回事?如何关闭' func' myObject实际上看到sayStuff()中引用的变量?我认为IIFE旨在保护国际范围内的内部人员?
答案 0 :(得分:5)
在这两种情况下,this
都是window
,全局默认上下文取代了您在调用内部函数表达式时未提供的上下文。
如果您想保留上下文,请不要在内部使用IIFE或在上下文中调用它们:
(function sayStuff(){
this.word = "hello2"; // still this is window, use var if you don't want that
(function() {
console.log(this.word); // window.word
}).call(this); // well, this is window...
}())
var myObject = {
word: "bar",
func: function() {
(function() {
console.log(this.word); // myObject.word
}).call(this);
}
};
myObject.func();
答案 1 :(得分:2)
IIFE仅隐藏本地范围的变量(即使用var
关键字创建的变量)。
所有触摸this.word
的函数都在全局上下文中调用(即不是作为对象的方法,不是new
关键字而不是apply
,{{1} }或call
),因此bind
在每种情况下均为this
。您正在处理全局变量。
如果你想要一个私人变量,你会做更多这样的事情:
window