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

JavaScript库中前导分号的作用是什么?,javascript,syntax,Javascript,Syntax,在几个JavaScript库中,我一开始就看到了这种符号: /** * Library XYZ */ ;(function () { // ... and so on 虽然我对“立即执行的函数”语法非常熟悉 我想知道前面的分号是什么意思。我所能想到的就是它是一种保险。也就是说,如果库被嵌入到其他有缺陷的代码中,那么它就充当了一种“最后一条语句最迟在这里结束”的减速器 它还有其他功能吗?它允许您将多个JavaScript文件安全地连接到一个文件中,以更快地作为一个HTTP请求使用。缩小J

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

/**
 * Library XYZ
 */
;(function () {
  // ... and so on
虽然我对“立即执行的函数”语法非常熟悉

我想知道前面的分号是什么意思。我所能想到的就是它是一种保险。也就是说,如果库被嵌入到其他有缺陷的代码中,那么它就充当了一种“最后一条语句最迟在这里结束”的减速器


它还有其他功能吗?

它允许您将多个JavaScript文件安全地连接到一个文件中,以更快地作为一个HTTP请求使用。

缩小JavaScript代码很好。它可以防止意外的语法错误。

问题实际上给出了最好的答案,因此为了清楚起见,我将在这里写下来:

领先的
可以防止在连接到包含未正确以
结尾的表达式的文件时附加文件时出错

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

通常,如果语句以(、[、/、+、或-)开头,则可能是 解释为前面语句的延续。以/、+、开头的语句, 和-在实践中非常罕见,但以(和[和]开头的语句并不少见 至少在某些类型的JavaScript编程中是这样 在任何此类语句的开头加上防御性分号,以便 即使修改前的语句和以前的 已删除终止分号:

资料来源:


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

假设您有多个函数:

iLife 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(){})()
var someVar = "myVar";(function(){})()
但是,如果在函数前添加分号,它将如下所示:

(function(){})()(function(){})()
;(function(){})();(function(){})()
var someVar = "myVar";(function(){})()
因此,通过添加一个
,它会注意任何表达式是否没有正确终止

示例2

(function(){
   // The rest of the code
})(); // Note it is also an IIFE
假设您有一个带有变量的JavaScript文件:

var someVar = "myVar"
另一个具有某些功能的JavaScript文件:

(function(){})()
现在,在连接上,它看起来像

var someVar = "myVar"(function(){})() // It may give rise to an error
使用分号时,它看起来像:

(function(){})()(function(){})()
;(function(){})();(function(){})()
var someVar = "myVar";(function(){})()
这被称为前导分号。


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

但是如果所有的文件都正确地编码了,就不需要t了,是吗?否:在您的示例中,您会得到
(function(){…})((function(){…})()
。我的意思是“正确编码”,即每个库都以正确数量的尾随分号结尾…是的,Boldewyn,但事实并非如此。两个编码错误的文件不适合仅因为第三个文件包含此脏修复程序。为什么串联器不能在结果中的文件之间添加额外的分号?例如什么?分号对下面的代码有意义吗?还是仅仅是假设在实际的图书馆前面的伪代码合并?在里面,代码本身没有特殊含义,但是当代码在其他代码的中间时,当你把它缩小到单行时,可能会出现意想不到的错误,比如(1)。前几行中缺少分号,(1)前一行也是函数,因此它将是(),当出现错误时,很难调试,我们不能说它是错误的,因为在缩微之前它运行良好。但正确处理这一问题肯定是缩微者的责任。错误的缩微者是当今的标准吗?如果你使用的是防御性分号,为什么还要用分号终止你的表达式?或者你抓住机会依赖分号ns出现在每行的末尾,或者您使用防御性分号。两者都使用会使人们错误地认为两者都有理由。使用防御性分号的建议很好;还建议将
“\n”
的每个实例替换为
”;\n
毫无意义。@VladimirKornea:因为您并不总是只使用自己的库:)因为你不能依赖别人的代码来遵循你的惯例。代码是防御性的,然后你就不必这样做了。@VladimirKornea如果你愿意的话,你也可以把它看作是防御性的——它是针对别人的代码的,而这些代码并不总是以防御性分号开头。