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

Cod*_*iac 1 javascript function iife

当我们使用独立的函数语句作为IIFE时,我们需要对其进行包装()以使其起作用

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

// IFFE
(function a(){
    console.log('Hello')
})()
Run Code Online (Sandbox Code Playgroud)

如果我们不包装()代码,则会产生语法错误

function a(){
    console.log('Hello')
}()
Run Code Online (Sandbox Code Playgroud)

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

let a = function a(){
    console.log('Hello')
}()
Run Code Online (Sandbox Code Playgroud)

那么,为什么()要在将其用作函数语句时需要包装它呢?

Cer*_*nce 5

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

(您可以将一些内容放在括号中,但它只是一个未使用的表达式,因此不会调用该函数:

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

console.log('done');
Run Code Online (Sandbox Code Playgroud)

(所述前function a确保了解释解析function a随后作为表达式(可以由使用,像值()以后谈到),而不是一个语句(什么-等声明在该范围中可用的功能-但确实不求值)。