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.