【问题标题】:Why Self-Executing Anonymous works? [duplicate]为什么自我执行匿名有效? [复制]
【发布时间】:2016-09-12 09:39:25
【问题描述】:

我知道自我执行匿名。通常我们将它们创建为

(function(){ return 1;})()

原因 - 如果我们使用没有运行的解析器功能

function(){ return 1}()

但今天我发现下一个代码也可以(检查括号顺序)

(function(){ return 1;}())

function(){ return 1; }() 仍然给我 SyntaxError,因为它应该

请解释为什么? Thx 供参考以获取更多详细信息

附:问题是关于(function(){ return 1;}()) 变体!

【问题讨论】:

  • 你没有关闭 (function(){ return 1; }() 中的括号
  • 它是包含函数的文本 - 都是正确的
  • 因为语法不正确。这:function(){ return 1; }() 根本没有被定义为有效的语法。
  • 出于同样的原因{a: 1, b: 2}[a] 不起作用。这里,{} 是一个块,而不是一个对象。这是因为{ 被解释为语句,而不是表达式。 ({a: 1, b: 2})[a]({a: 1, b: 2}[a]) 确实有效,因为 () 强制 {} 被解释为表达式(对象)。函数也一样,因为有函数语句和函数表达式。为什么?因为这就是 JavaScript 的设计方式。

标签: javascript function self-executing-function


【解决方案1】:

短语IIFE 是这些函数的更好术语.. 立即调用函数表达式。

至于为什么它们是相同的:外部括号() 只是做一个表达式,() 一起做调用。

(function(){ return 1;})()
is the same as:
(function(){ return 1;}())


(function(){ return 1;})()
becomes
(functionexpression)()
becomes
functionexpression()

(function(){ return 1;}())
becomes
(functionExpression())
becomes   
functionExpression()

出于同样的原因

(3)+2((3)+2) 相同。

编辑

function(){ return 1; }()

不起作用,因为 function statementfunction expression 不同。函数语句不能立即调用。

【讨论】:

    【解决方案2】:
    (function() {})()
    

    (function() {}())
    

    是等价的。

    要调用第二个示例,您可以在函数之前包含 + 运算符

    +function(){ return 1 }()
    

    Immediately-Invoked Function Expression (IIFE)

    【讨论】:

    • 有比+ 更好的运算符可供使用。原因是+ 被重载为二元运算符,因此如果您不小心忘记了前一个表达式后的分号,它会尝试将前一个表达式添加到函数中。这与人们使用() 时遇到的问题基本相同。如果要使用备用运算符来强制表达式,请使用一元运算符,例如 !
    • @squint "有比 + 更好的运算符可以使用" , "如果您要使用替代运算符来强制表达式,请使用一元运算符,例如!。” 是的,但不适用于这种特殊情况; !function(){ return 1 }() 返回 false 而不是 1
    • @squint 或者,;null, function(){ return 1 }();
    • 如果正在捕获返回值,则不需要任何运算符使函数成为有效表达式。但是,是的,避免对操作员进行意外评估的任何事情都会更好。我过去有时使用过void
    猜你喜欢
    • 2013-12-07
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多