函数前面的分号是什么意思?

时间:2012-04-06 14:11:25

标签: javascript

我正在看一个开源项目,看到这样的事情:

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

我想知道分号是否有特殊含义?

3 个答案:

答案 0 :(得分: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() {}()

答案 1 :(得分:1)

JavaScript具有自动分号插入功能(请参阅ECMAScript Language Specification中的第7.9节):

  

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

     
      
  1. 当从左到右解析程序时,会遇到一个令牌(称为违规令牌)   语法的任何产生都不允许,然后在分配之前自动插入分号   如果满足下列一个或多个条件,则会触发令牌:   
        
    • 违规令牌通过至少一个 LineTerminator 与前一个令牌分开。
    •   
    • 违规令牌为}
    •   
  2.   
  3. 当从左到右解析程序时,会遇到令牌输入流的末尾,并且解析器无法将输入令牌流解析为单个完整的ECMAScript程序,然后会自动插入分号输入流的结束。
  4.   

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

答案 2 :(得分:0)

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

http://mislav.uniqpath.com/2010/05/semicolons/
(参见“没有分号编码时唯一真正的陷阱”)

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

评估为

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

最重要的是,在以(a characther。)开头的每一行之前加上分号是个好习惯。