【问题标题】:Why do we need to wrap IIFE with ()为什么我们需要用 () 包裹 IIFE
【发布时间】:2019-08-27 01:46:42
【问题描述】:

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

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

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

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

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

但是当我们使用 as 函数表达式时,我们不需要用 () 包装它

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

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

【问题讨论】:

    标签: javascript function iife


    【解决方案1】:

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

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

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

    )

    ( 放在function a 之前可确保解释器将function a 解析为表达式(可以使用的值,例如稍后出现的() ),而不是一个语句(它一些事情——比如声明在那个范围内可用的函数——但不计算为一个值)。

    【讨论】:

    • 我没想到会有这么简洁的答案,但这很有意义!将(a()) 放入第二个 sn-p 的“调用”调用中的行为与最后一个(第三个)sn-p 相同。
    • 感谢您的回答队友 :) 所以我可以使用任何可以解析的东西将其读取为表达式,例如[function a(){}()]
    • 是的,甚至可以做一些傻事,比如7 + function a(){ console.log('x')}()
    猜你喜欢
    • 2013-07-15
    • 2014-10-22
    • 2019-06-09
    • 1970-01-01
    • 2017-12-27
    • 2014-06-18
    • 2017-02-26
    • 2011-04-03
    • 2017-07-27
    相关资源
    最近更新 更多