看一个简单的IIFE的例子
((x) => x)(1) // returns 1
如果我以可以作为回调传递的常规(但匿名)函数的方式来考虑这一点:
setTimeout(function() {alert(1)}, 1000)
匿名函数仍在被调用。 IIFE类似地看起来像是作为回调传递给 某些函数 ,该函数返回一个函数。
看起来此返回的函数然后用1
的参数调用,然后IIFE由 某些函数 < / p>
这是正确的吗? 某些功能 定义在哪个对象上?是窗口/全局吗?还是这是JavaScript实现功能而不是语言功能?
答案 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}}。