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

4

我正在查看一个开源项目,看到类似于这样的内容:

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

我想知道那里的分号是否具有特殊含义?


13
那是一个分号。它可能存在于文件被导入之前,另一个文件缺少尾随分号的情况下。 - Pointy
@Pointy 谢谢。你能把它发布在答案中,这样我就可以接受它来结束这个问题了。 - wong2
3个回答

7
这是因为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
这里有一个非常好的解释:

https://mislav.net/2010/05/semicolons/
(请看“在没有分号的情况下编码时唯一的真正陷阱”段落)

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

被评估为

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

总之,在每个以"("字符开头的行前放置一个分号是一个好的编程习惯。


1

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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接