JavaScript 库中的主要分号是做什么的?

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

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

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

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

我想知道前面的分号是干什么用的。我能想到的就是这是一种保险。也就是说,如果这个库嵌入到其他有错误的代码中,它就会成为“最后一条语句最晚在这里结束”的减速带。

它还有其他功能吗?

11729 次浏览

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

当你缩小 JavaScript 代码的时候它是很好的,它可以防止意外的语法错误。

问题给出了最佳答案,所以为了清楚起见,我把它写下来:

在立即调用的函数表达式前面的前导 ;是为了防止在连接过程中将文件追加到一个包含表达式的文件时出现错误,该表达式没有以 ;正确终止。

最佳实践是使用分号结束表达式,但也使用前面的分号作为保护措施。

一般来说,如果一个语句以(,[ ,/,+ ,或-开头,那么它有可能是 以/,+ 开头的语句, 和-在实践中非常罕见,但以(and [开头的语句并不少见 至少在某些类型的 JavaScript 编程中是这样。有些程序员喜欢 在任何这样的语句的开头放一个防御性分号,以便 即使修改之前的语句和之前的 去掉终止分号:

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

来源:

JavaScript: 权威指南,第6版

一个简单的答案是安全地连接多个 JavaScript 文件。 使用分号不会引起问题。

假设您有多个函数:

生活1

(function(){
// The rest of the code
})(); // Note it is an 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(){})()

这被称为前导分号。

它的主要目的是保护自己不受前面不正确关闭的代码的影响,这些代码可能会导致问题。分号可以防止这种情况发生。如果前面的代码被不正确地关闭,那么我们的分号将纠正这一点。如果正确关闭,那么我们的分号将是无害的,不会有任何副作用。