【问题标题】:Why does "this" inside functions defined in and passed to IIFE's reference the function itself?为什么“this”在函数中定义并传递给 IIFE 引用函数本身?
【发布时间】:2018-07-12 10:34:51
【问题描述】:

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

我正试图绕过this 并一直在阅读凯尔辛普森,但遇到了一个我不明白的案例。

据我了解,当您在另一个函数中调用一个函数时,如果该函数被称为“独立”(请参阅​​此处的辛普森: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 引用被调用的函数,而不是“调用者”或定义它的默认情况。

知道这里发生了什么吗?

【问题讨论】:

  • "当你在另一个函数中调用一个函数时, this 会从它定义的地方获取它的作用域。" 不,你需要一个箭头函数来实现这一点。另请注意,第二个 sn-p 不是 IIFE。
  • 我正在使用您的 IIFE 获取 window,而不是 globo。顺便说一句,您的 IIFE 缺少第一个括号。
  • function calling(x) {....}(function globo() { ...}) 在语法上等价于function calling(x) {....}; (function globo() { ...}),并产生globo 作为其值。 globo 没有得到console.log'd,没有函数被执行,它只是控制台返回最后一次评估的结果,就好像你写了1;2;3,它会显示3。正如其他人已经说过的那样,您缺少 !+(...) 或其他强制解析器将其评估为 IIFE 的方式。

标签: javascript this iife


【解决方案1】:

实际上,这不是 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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 2020-02-17
    • 2011-12-07
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多