javascript - 为什么在 IIFE 中定义并传递给函数的 "this"引用函数本身?

标签 javascript this iife

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

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

据我了解,当您在另一个函数中调用一个函数时,如果该函数被称为“独立”(参见 Simpson 此处:You Don't Know JS: this and Object Prototypes),那么 this 应该是 Window(如果在 strict 模式下,则为 undefined)

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 引用被调用的函数,而不是“调用者”或定义它的默认情况。

知道这里发生了什么吗?

最佳答案

实际上,那不是 IIFE。按照你写的方式,你基本上已经定义了一个函数,调用你永远不会调用,然后是另一个函数,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)。

关于javascript - 为什么在 IIFE 中定义并传递给函数的 "this"引用函数本身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51303409/

相关文章:

c++ - C++中有便利构造函数吗?

javascript - 谷歌地图商店定位器将硬编码初始化修改为动态

javascript - iife 返回的函数无法正常工作

javascript - 以一个括号开头的 IIFE 不起作用

javascript - 在 IOS 的 UIWebview 中引用 js 和 css 文件?

javascript - 根据div颜色背景更改div的颜色

javascript - 传递给 __defineGetter__ 的函数中 "this"的值是多少

javascript - 如何在 IIFE 表达式中调用函数

javascript - 管道化 ajax http 请求并仅在最新请求上执行成功函数

javascript - React 中回调函数的返回值