JavaScript库中的前导分号有什么作用?

Bol*_*wyn 151 javascript syntax

在几个JavaScript库中,我在一开始就看到了这种符号:

/**
 * Library XYZ
 */
;(function () {
  // ... and so on
Run Code Online (Sandbox Code Playgroud)

虽然我对"立即执行的函数"语法非常满意

(function(){...})()
Run Code Online (Sandbox Code Playgroud)

我想知道领先的分号是什么.我能想到的是,它是一种保险.也就是说,如果库嵌入在其他有缺陷的代码中,那么它就是"最后一个语句在最后结束"的速度缓冲.

它有任何其他功能吗?

Kor*_*nel 137

它允许您安全地将多个JS文件连接成一个,以便作为一个HTTP请求更快地提供它.

  • 但是没有必要,如果所有文件都能正确编码,是吗? (16认同)
  • 只有第三个文件包含这个脏修复的事实才能使两个编码错误的文件不适合.为什么连接器不能在结果中的文件之间添加额外的分号? (12认同)
  • 不:在你的例子中,你得到`(function(){...})()(function(){...})()`. (8认同)
  • 我的意思是'正确编码',每个库都以正确数量的尾随分号结尾...... (8认同)
  • 是的Boldewyn,但事实并非如此. (6认同)

hol*_*ple 30

最好的答案实际上是在问题中给出的,所以为了清楚起见,我会在这里写下来:

;立即调用的函数表达式前面的前导是为了防止在连接期间将文件附加到包含未正确终止的表达式的文件时出错;.

最佳做法是使用分号终止表达式,但也使用前导分号作为安全措施.

  • 因为你不能依赖别人的代码遵循你的约定.防守代码,然后你不必. (6认同)
  • @VladimirKornea:因为你并不总是只使用自己的库:) (4认同)

Far*_*ini 24

一般来说,如果一个语句以(,[,/,+或 - )开头,它有可能被解释为之前语句的延续.以/,+和 - 开头的语句在实践中很少见,但是开头的语句(和[并不少见,至少在某些样式的JavaScript编程中.一些程序员喜欢在任何这样的语句的开头加上一个防御分号,这样即使语句也会继续正常工作)在修改之前删除先前终止的分号:

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

资源:

Javascript权威指南第6版


bvm*_*der 9

这被称为领先的分号.

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


brk*_*brk 6

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

假设您具有多种功能:

IIFE 1

(function(){
  // The rest of the code
})(); // Note it is an IIFE
Run Code Online (Sandbox Code Playgroud)

IIFE 2

(function(){
   // The rest of the code
})(); // Note it is also an IIFE
Run Code Online (Sandbox Code Playgroud)

在连接时,它可能看起来像:

(function(){})()(function(){})()
Run Code Online (Sandbox Code Playgroud)

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

;(function(){})();(function(){})()
Run Code Online (Sandbox Code Playgroud)

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

例子2

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

var someVar = "myVar"
Run Code Online (Sandbox Code Playgroud)

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

(function(){})()
Run Code Online (Sandbox Code Playgroud)

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

var someVar = "myVar"(function(){})() // It may give rise to an error
Run Code Online (Sandbox Code Playgroud)

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

var someVar = "myVar";(function(){})()
Run Code Online (Sandbox Code Playgroud)