为什么我们需要用 () 包裹 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
解析为 表达式 (一个可以是使用,就像稍后出现的 ()
一样),而不是语句( 做 某些事情——比如声明函数在该范围内可用——但不求值).
当我们使用一个独立的函数语句作为 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
解析为 表达式 (一个可以是使用,就像稍后出现的 ()
一样),而不是语句( 做 某些事情——比如声明函数在该范围内可用——但不求值).