关于javascript:分号之前的自调函数?

Semicolon before self-invoking function?

本问题已经有最佳答案,请猛点这里访问。

在JavaScript中使用自调用函数之前使用分号有什么好处。 我在几个流行的jQuery插件中看到了这种方法,我很想知道这是否是我不知道的JavaScript中的下一个很棒的东西。 先谢谢你们!


如果将两个文件与自调用函数连接在一起,如下所示:

文件A:

1
(function(){...A...})()

档案B:

1
(function(){...B...})()

文件A + B:

1
(function(){...A...})()(function(){...B...})()

你有两个没有分隔符的语句。当您将文件合并在一起然后缩小它们时会发生这种情况。

现在,文件B的作者在前面加了一个分号:

档案B2:

1
;(function(){...B2...})()

你会得到一个有效的脚本:

1
(function(){...A...})();(function(){...B2...})()


自调用函数被括号括起来,并且在JavaScript中括号被重载为含义

  • 对表达式进行分组以覆盖优先级:(x + y) * z
  • 功能应用:f()
  • 在函数前面加一个分号可以防止函数在括号与函数应用程序混淆时变成前面的参数。

    考虑

    1
    2
    3
    var x = 42

    (function () { ... })()

    是相同的

    1
    var x = 42(function () { ... })()

    1
    2
    3
    4
    5
    var x = 42

    ;

    (function () { ... })()

    是相同的

    1
    2
    3
    var x = 42;

    (function () { ... })()


    我以无分号的方式编写所有JavaScript。由于自动分号插入(ASI),在每行末尾没有分号的情况下写入时,有一些特殊情况首先会"混淆":

  • 使用运算符启动顶级表达式,在这种情况下,((开括号)与大多数其他运算符一样,可以继续前一个表达式,从而抑制"自动插入分号"。 (这通常仅在使用自调用函数时发生。)

  • 开玩笑说#2:没有人! (只学习一条规则,你也可以享受没有额外分号的生活;-)

  • 因为我以无分号的方式编写,所以我总是把它写成(函数表达式自然可以跨越多行):

    1
    ;(FunctionExpression)()

    在我的情况下,它不是关于"安全"或试图"发现错误"(老实说,如果你的风格是使用分号并且你忘记了分号,那么你已经在其他地方创建了错误并且写了一个;在"安全"的开始是hogwash)。没有;在我的情况下,它是为了与我所选择的风格的知识保持一致并且"知道"与操作员开始一行可以继续前一行的表达。

    请参阅JavaScript:分号插入(您需要了解的所有内容)以获取详细信息(这是迄今为止我在该主题上看到的最佳文章)。

    快乐的编码。


    对我来说,半冒号在Internet Explorer 8中触发错误(或者至少是IETester所说的),并阻止ui选项卡正常工作。

    错误消息是Invalid character in jquery.all.ui.js Line: 1. Char: 1

    我完全偶然发现了分号。
    当我从;(function($)中删除;时,它起作用,看似没有副作用或功能丧失。
    我正在使用Drupal,不知道这是否与此事有关。