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

时间:2019-09-20 15:47:00

标签: javascript function closures hosting

我尝试使用立即调用函数表达式来运行另一个函数。 如果我使用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

里面发生了什么?

1 个答案:

答案 0 :(得分:1)

因为不能直接调用函数声明,这就是为什么将(...)解析为单独的语句之后的原因。

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

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

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

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