JavaScript库中领先的分号有什么作用?


156

在几个JavaScript库中,我在一开始就看到了这种表示法:

/**
 * Library XYZ
 */
;(function () {
  // ... and so on

虽然我对“立即执行的功能”语法完全满意

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

我想知道领先的分号是做什么用的。我所能想到的就是这是一种保险。也就是说,如果该库嵌入其他错误代码中,则它充当“最后一条语句最迟在此处结束”的减速方式。

它还有其他功能吗?


Answers:


140

它使您可以安全地将多个JavaScript文件连接到一个文件中,以将其作为一个HTTP请求更快地提供服务。


16
但这不是必须的,如果所有文件都可以正确编码,是吗?
Boldewyn

8
否:在您的示例中,您将获得(function(){...})()(function(){...})()
亚伦·迪古拉

8
我的意思是“正确编码”,即每个库都以正确数量的尾部分号结尾...
Boldewyn 2009年

6
是的Boldewyn,但事实并非如此。
Mathias Bynens 09年

13
仅仅由于第三个文件包含此肮脏的修补程序这一事实,就无法容纳两个编码错误的文件。为什么连接器不能在结果中的文件之间添加多余的分号?
大卫·霍瓦特

30

最佳答案实际上是在问题中给出的,因此为了清楚起见,我将其写在这里:

;立即调用的函数表达式的前导是为了防止在串联过程中将文件追加到包含未正确以终止的表达式的文件时出错;

最佳做法是用分号终止表达式,但也要使用前导的分号作为保护措施。


如果使用防御性分号,为什么还要用分号终止表达式?您要么有机会依靠每行结尾处的分号,要么使用防御性分号。两者都做会使人错误地得出结论,有理由两者都做。使用防御性分号的建议很好;该建议同时更换的每个实例"\n"";\n"没有意义。
Vladimir Kornea

4
@VladimirKornea:因为您并不总是只使用自己的库:)
jvenema

@jvenema我不知道您为什么认为这有所作为。
弗拉基米尔·科纳

6
因为您不能遵守约定,所以不能依赖别人的代码。进行防御性编码,然后您不必这样做。
jvenema '16

1
@VladimirKornea如果愿意,您也可以将其视为防御性的-它可以防御并非总是以防御性分号开头的其他人的代码。
Nathan Hinchey

26

通常,如果一条语句以(,[,/,+或-开头,则有可能将其解释为之前的语句的延续。 ,但至少在某些JavaScript编程风格中,以(和[开头的语句并不罕见。一些程序员喜欢在任何此类语句的开头加上一个防御性的分号,以便即使该语句也可以继续正常工作。在对其进行修改并删除先前终止的分号之前:

var x = 0 // Semicolon omitted here
;[x,x+1,x+2].forEach(console.log) // Defensive ; keeps this statement separate

资源:

JavaScript:权威指南,第6版


9

这被称为前导分号。

它的主要目的是保护自己免受未正确关闭的先前代码的影响,这可能会导致问题。分号可以防止这种情况的发生。如果前面的代码未正确关闭,则我们的分号将更正此错误。如果将其正确关闭,那么我们的分号将是无害的,并且不会产生任何副作用。


7

单行答案是安全地串联多个JavaScript文件。使用分号不会引起问题。

假设您具有多种功能:

IIFE 1

(function(){
  // The rest of the code
})(); // Note it is an IIFE

IIFE 2

(function(){
   // The rest of the code
})(); // Note it is also an IIFE

在串联时,它可能看起来像:

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

但是,如果在函数之前添加分号,它将看起来像:

;(function(){})();(function(){})()

因此,通过添加;,可以确保是否未正确终止任何表达式。

例子2

假设您有一个带变量的JavaScript文件:

var someVar = "myVar"

另一个具有某些功能的JavaScript文件:

(function(){})()

现在在串联时,它看起来像

var someVar = "myVar"(function(){})() // It may give rise to an error

使用分号,它将看起来像:

var someVar = "myVar";(function(){})()

4

当您最小化JavaScript代码时,这很好。它可以防止意外的语法错误。


像什么?分号对下面的代码有意义吗?还是只是将假设的错误代码合并到实际库的前面?
Boldewyn

在其中,单独的代码没有特殊含义,但是当该代码位于其他代码的中间并且将其缩小为一行时,可能会出现意外错误,例如(1)前一行中缺少分号,(1 )上一个也是函数,因此它将是()()()(),当遇到错误,难以调试时,我们不能说它有错误,因为在缩小其运行之前是可以的。

1
但是,可以肯定的是,正确处理这些是采矿者的责任。如今,越野车制造商是常态吗?
Vladimir Kornea
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.