【问题标题】:Difference between javascript Iffy structure [duplicate]javascript iffy结构之间的区别[重复]
【发布时间】:2016-09-23 22:56:23
【问题描述】:

这些js函数结构有什么区别

(function () { console.log("Foo!"); }());

(function () { console.log("Foo!"); })();

;(function () { console.log("Foo!"); }());

+function() { console.log("done!"); }();

【问题讨论】:

  • 它们都是相同的...函数表达式。括号强制表达式与函数声明..否则就像 (3+5) === (3+(5))。
  • 前 3 个中的差异为零。最后一个将结果强制为数字(并且由于函数返回 undefined 它产生 NaN)。
  • @JeremyJStarcher——最后一个不同。
  • @RobG 是的——但由于该值没有被分配到任何地方,我不认为这是一个区别。
  • @JeremyJStarcher 这怎么可能是重复的?

标签: javascript html


【解决方案1】:

它们几乎都一样。

前两个完全相同。他们定义函数,调用它,并评估结果(以防有人将结果用于任何事情)。是说(function() { })() 还是(function() { })()) 是一个有争议的问题。一些 linter 有强烈的偏好,如果你不按照“他们的”方式去做,他们会抱怨。从语义上讲,它们是相同的。在任何一种情况下,初始括号都会强制解析器将其视为函数表达式。在第一种情况下,函数表达式本身用() 调用,然后前括号闭合;在第二种情况下,将调用包含函数表达式的括号表达式。

后两种情况用于防止连接JS文件时可能出现的问题。感叹号也经常用于此目的。这在 SO 上的其他问题中有所涉及,例如 thisthisthisthis

【讨论】:

    【解决方案2】:

    据我所知,前三个没有区别。

    当您编写立即调用函数表达式时,外部参数括号可以存在于环绕括号的内部和外部。想一想,就像用于相同目的的另一种语法。

    所以这个:

    (
        function() {
        }
    ());
    

    还有这个:

    (
        function() {
        }
    )();
    

    完全平等。

    对于第三个示例,分号,在文件连接的情况下用作保护措施。当您编写代码时,您或供应商可能有一个不以分号结尾的脚本。在这种情况下,当您连接之前的文件代码时,不以问号结尾的代码会中断脚本。

    举例

    script-1.js

    var name = 'Nikos';
    console.log( name )
    

    script-2.js

    (
        function() {
           // Do some stuff here
        }
    )();
    

    concatenation.js

    var name = 'Nikos';
    console.log( name ) // This line will throw an error, because it is not the last statement in the file.
    
    (
       function() {
           // Do some stuff here
        }
    )();
    

    但是如果我们把 script-2.js 改成这样:

    script-2.js

    ;(
        function() {
           // Do some stuff here
        }
    )();
    

    concatenation.js 将如下所示:

    var name = 'Nikos';
    console.log( name )
    
    ;(  // This will force the previous statement to finish.
       function() {
           // Do some stuff here
        }
    )();
    

    最后我发现了这个:

    它强制解析器将 + 之后的部分视为 表达。这通常用于调用的函数 立即,例如:

    +function() { console.log("Foo!"); }();
    

    如果没有 + ,如果解析器处于期望语句的状态(可以是 表达式或几个非表达式语句),单词函数 看起来像函数声明的开始,而不是 函数表达式和它后面的 () (末尾的那些 上面的行)将是一个语法错误(就像缺少 a 名称,在该示例中)。加上 +,它使它成为一个函数表达式, 这意味着名称是可选的,并导致引用 函数,可以调用,所以括号有效。

    • 只是其中一种选择。它也可以是 -、!、~ 或任何其他一元运算符。或者,您可以使用括号(这 更常见,但在语法上既不正确也不正确):
    (function() { console.log("Foo!"); })();
    // or
    (function() { console.log("Foo!"); }());
    

    来自:https://stackoverflow.com/a/13341710/1150619

    【讨论】:

    • 什么是“希腊问号”?
    • 对不起 :) xaxaxa 它是分号; 这在希腊语中用作问号。
    • 分号在希腊语中用作问号。最好编辑这个答案。
    • 好的,伙计们,我做得更简单;)
    猜你喜欢
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 2010-10-06
    • 2017-04-11
    • 2018-09-20
    • 2011-11-05
    相关资源
    最近更新 更多