从哪里实际调用IIFE?

时间:2018-09-26 06:17:11

标签: javascript iife

看一个简单的IIFE的例子

((x) => x)(1) // returns 1

如果我以可以作为回调传递的常规(但匿名)函数的方式来考虑这一点:

setTimeout(function() {alert(1)}, 1000)

匿名函数仍在被调用。 IIFE类似地看起来像是作为回调传递给 某些函数 ,该函数返回一个函数。

看起来此返回的函数然后用1的参数调用,然后IIFE由 某些函数 < / p>

这是正确的吗? 某些功能 定义在哪个对象上?是窗口/全局吗?还是这是JavaScript实现功能而不是语言功能?

1 个答案:

答案 0 :(得分:3)

  

IIFE类似地看起来像是作为回调传递给某些函数并返回一个函数。

不。在

    f(1)

只有一个函数调用:f被直接调用。

//     v v function call operator
    (f)(1)
//  ^ ^ grouping

仍然只有一个函数调用。该代码等效于f(1);仅添加了一些多余的括号。

我们不仅限于调用变量。我们可以使用任何想要的表达式(只要它的值是一个函数):

(function (x) { ... })(1)

// equivalent to:
     let f = function (x) { ... };
     f(1);
// but without needing a temporary variable

我们不能只写function () { ... }()的唯一原因是function关键字不能出现在语句的开头(如果存在,则将其解析为函数声明的开头) ,而不是函数表达式)。但是例如

void function () { console.log("hello"); }();

console.log( function (x) { return x + 1; }(1) );

是完全有效的语句(包含IIFE)。

=>函数的情况略有不同。在这里,我们只需要担心功能主体向右延伸多远。

(() => console.log("hello"))();

...需要对函数表达式进行解析,因为否则,最后的()将被解析为函数主体console.log("hello")()的一部分,它将试图调用{{ 1}}。