IIFE 运行 函数声明和函数表达式结果不同

IIFE run Function Declaration and Function Expression with different result

我尝试将立即调用的函数表达式用于 运行 另一个函数。 如果我使用 FE,结果会出错

let f = function(x) {
  alert(x)
}

(function() {
  f(1)
}())
// ReferenceError: Cannot access 'f' before initialization

使用 FD 有效:

function f(x) {
  alert(x)
}

(function() {
  f(1)
}())
// 1

里面发生了什么?

因为函数声明不能直接调用,所以(...)被解析为单独的语句。

您永远不会以 ; 结束包含 函数表达式 的变量声明,因此以下括号是函数调用:

 let f = function() { /*...*/ }(/*...*/)(/*...*/);

TLDR:始终以分号结束语句。

 let f = function() { /*...*/ }; // <<<