IIFE 实际上是从哪里调用的?
From where is an IIFE actually invoked?
查看简单 IIFE 的示例
((x) => x)(1) // returns 1
如果我将其视为可以作为回调传递的常规(但匿名)函数:
setTimeout(function() {alert(1)}, 1000)
匿名函数仍在调用中。 IIFE 同样看起来像是作为回调传递给 某个函数 的 returns 函数。
看起来这个返回的函数然后用参数 1
调用,然后 IIFE 由 some function[=29] 返回的函数调用=]
这是正确的吗? 某个函数定义在什么对象上?是window/global吗?或者这是 JavaScript 实现功能而不是语言功能?
The IIFE similarly looks like it is passed as a callback to some function that returns a function.
没有。在
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")()
,它将尝试调用从console.log
.
查看简单 IIFE 的示例
((x) => x)(1) // returns 1
如果我将其视为可以作为回调传递的常规(但匿名)函数:
setTimeout(function() {alert(1)}, 1000)
匿名函数仍在调用中。 IIFE 同样看起来像是作为回调传递给 某个函数 的 returns 函数。
看起来这个返回的函数然后用参数 1
调用,然后 IIFE 由 some function[=29] 返回的函数调用=]
这是正确的吗? 某个函数定义在什么对象上?是window/global吗?或者这是 JavaScript 实现功能而不是语言功能?
The IIFE similarly looks like it is passed as a callback to some function that returns a function.
没有。在
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")()
,它将尝试调用从console.log
.