免责声明:我已经被警告说这个问题可能会被否决。如果您没有,我将不胜感激-我在Javascript课程中向我的老师询问了解释,而他不知道,所以我想我会在这里询问...
我正试图将自己的头围在this
上,并一直在阅读Kyle Simpson,但遇到了一个我不理解的情况。
据我了解,当您在另一个函数中调用一个函数时,如果该函数被称为“独立”(请参见此处的Simpson:You Don't Know JS: this and Object Prototypes),则this
应该为Window
(或undefined
(如果它处于strict
模式)
var fn = function globo () { console.log(this);};
function calling(called) {
console.log(called());
}
calling(fn); // "Window" or "undefined"
但是如果您将类似的函数传递给IIFE,您会得到一个奇怪的结果
function calling(called) {
console.log(called());
}(function globo () { console.log(this);}); // [Function: globo]
这似乎是一种罕见的情况,其中this
引用了被调用的函数,而不是“调用者”或定义该函数的默认情况。
你知道这是怎么回事吗?
答案 0 :(得分:7)
实际上,这不是IIFE。按照您编写的方式,您基本上已经定义了一个函数calling
,该函数从未调用 ,此后,另一个函数globo
也从未被调用。如果您在控制台中执行此代码,则会得到globo
的结果,因为这是最后一个表达式的值–因为您使用的是括号,而不是函数声明。
您可以再次检查运行此代码:
function calling(called) {
console.log('foo');
}(function globo () {});
您可能会得到相同的结果。
IIFE应该是:
(function calling(called) {
console.log(called());
})(function globo () { console.log(this)});
实际上this
返回Window
(或undefined
)的地方。