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

问题描述 投票:148回答:6

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

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

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

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

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

它有任何其他功能吗?

javascript syntax
6个回答
136
投票

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


30
投票

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

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

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


23
投票

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

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

资源:

Javascript the Definitive Guide 6th edition


9
投票

这被称为领先的分号。

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


6
投票

一行答案是安全地连接多个javascript文件。使用semi-colon不会引发问题

假设您有多个功能

IIFE 1

(function(){
  //Rest of code
})(); // Note it is a IIFE 

IIFE 2

(function(){
   // Rest of code
})(); // Note it is also IIFE

在连接上它可能看起来像

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

但是如果你在函数之前添加一个semi-colon就会看起来像

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

因此,通过添加;,如果任何表达式未正确终止,则需要注意。

例2

假设你有一个带变量的js文件

var someVar = "myVar"

另一个带有一些功能的js文件

(function(){})()

现在连接它看起来像

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

使用semi-colon它看起来像

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

4
投票

当你缩小js代码时它很好。防止意外的语法错误。

© www.soinside.com 2019 - 2024. All rights reserved.