为什么 "this" 内部函数定义并传递给 IIFE 引用函数本身?

Why does "this" inside functions defined in and passed to IIFE's reference the function itself?

免责声明:有人警告我这个问题可能会被否决。如果您不这样做,我将不胜感激——我在 Javascript 课程中向我的老师询问了解释,但他不知道,所以我想我应该在这里问...

我正在努力思考 this 并一直在阅读 Kyle Simpson,但遇到了一个我不明白的案例。

据我了解,当您在另一个函数中调用一个函数时,如果该函数被调用 "standalone"(参见 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 引用被调用的函数,而不是 "caller" 或定义它的默认情况。

知道这里发生了什么吗?

实际上,那不是 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 returns Window(或 undefined)。