为什么在IIFE中定义并传递给IIFE的内部函数中的“ this”引用了函数本身?

时间:2018-07-12 10:34:51

标签: javascript this iife

免责声明:我已经被警告说这个问题可能会被否决。如果您没有,我将不胜感激-我在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引用了被调用的函数,而不是“调用者”或定义该函数的默认情况。

你知道这是怎么回事吗?

1 个答案:

答案 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)的地方。