为什么我们需要用 () 包裹 IIFE

Why do we need to wrap IIFE with ()

当我们使用一个独立的函数语句作为 IIFE 时,我们需要用() 包装它以使其工作

// IFFE
(function a(){
    console.log('Hello')
}());

// IFFE
(function a(){
    console.log('Hello')
})()

如果我们不使用 () 进行换行,代码会产生语法错误

function a(){
    console.log('Hello')
}()

但是当我们用作函数表达式时,我们不需要用()

包裹它

let a = function a(){
    console.log('Hello')
}()

那么当我们想将它用作函数语句时,为什么我们需要用 () 包装它?

当解释器解析 Javascript 文本时,遇到新行和 function a 时,它将开始将其解释为名为 a 的函数的函数声明.最终,它将以 } 到达功能块的末尾。如果你在后面放一个 (),它会尝试将 ( 解析为表达式的开头 - 但表达式必须求值为 something,它不能为空,所以当它看到 ) 时,它会抛出。

(你可以把一些东西放在括号里,但它只是一个未使用的表达式,函数不会被调用:

function foo() {
  console.log('foo');
}(123);

console.log('done');

)

( 放在 function a 之前确保解释器将后面的 function a 解析为 表达式 (一个可以是使用,就像稍后出现的 () 一样),而不是语句( 某些事情——比如声明函数在该范围内可用——但不求值).