3

I'm looking at an open source project, and see something like this :

;(function(){
    // codes here
})()

I'd like to know whether the semicolon there has a special meaning?

4

3 回答 3

5

这是因为 ASI(自动分号插入)允许您避免使用分号。

例如,您可以编写这样的代码而不会出错:

var a = 1
a.fn = function() {
    console.log(a)
}

看?没有一个分号。

但是,在某些情况下不插入分号。基本上,在实际项目中,有一种情况不是这样:下一行以括号开头。

javascript 解析器将下一行作为参数,并且不会自动添加分号。

例子:

var a = 1
(function() {})()
// The javascript parser will interpret this as "var a = 1(function() {})()", leading to a syntax error

为了避免这种情况,有几种方法:

  • 在以括号开头的行的开头添加分号(在您显示的代码中完成)
  • 使用以下结构:

    !function() {}()

于 2012-04-06T14:24:12.023 回答
1

JavaScript 具有自动分号插入功能(参见ECMAScript 语言规范中的第 7.9 节):

分号插入的三个基本规则:

  1. 当从左到右解析程序时,遇到任何语法生成都不允许的标记(称为违规标记)时,如果出现以下一项或多项,则在违规标记之前自动插入分号条件为真:
    • 违规标记与前一个标记至少有一个LineTerminator分开。
    • 有问题的令牌是}.
  2. 当程序从左到右解析时,遇到输入令牌流的结尾,并且解析器无法将输入令牌流解析为单个完整的 ECMAScript 程序,则在末尾自动插入分号输入流。

通常您可以省略 JavaScript 文件中的最后一个分号(第二条规则)。如果您的应用程序通过合并多个文件来创建 JavaScript 代码,这将导致语法错误。由于;它本身是空语句,您可以使用它来防止此类语法错误。

于 2012-04-06T14:26:48.030 回答
0

可以在这里找到一个很好的解释:

https://mislav.net/2010/05/semicolons/
(参见“没有分号的编码时唯一真正的陷阱”段落)

var x = y
(a == b).print()

被评估为

var x = y(a == b).print()

最重要的是,在以“(”字符开头的每一行之前放置一个分号是一个好习惯

于 2012-04-06T14:41:32.320 回答