在几个JavaScript库中,我从一开始就看到了这种符号:
/**
* Library XYZ
*/
;(function () {
// ... and so on
虽然我对“立即执行的函数”语法非常满意
(function(){...})()
我想知道领先的分号是什么。我能想到的是,它是一种保险。也就是说,如果库嵌入在其他有缺陷的代码中,那么它就是“最后一个语句在最后结束”的速度缓冲。
它有其他任何功能吗?
答案 0 :(得分:133)
它允许您安全地将多个JS文件连接成一个,以便作为一个HTTP请求更快地提供它。
答案 1 :(得分:30)
问题中实际给出了最佳答案,所以为了清楚起见,我将在此处写下来:
在立即调用的函数表达式前面的前导;
用于防止在串联期间将文件附加到包含未使用;
正确终止的表达式的文件时出错。
最佳做法是使用分号终止表达式,但也使用前导分号作为安全措施。
答案 2 :(得分:23)
通常,如果语句以(,[,/,+或 - )开头,则可能是 被解释为之前声明的延续。以/,+开头的语句 而且 - 在实践中非常罕见,但是以(和[并非罕见的]开头的陈述 至少在某些样式的JavaScript编程中。有些程序员喜欢 在任何此类陈述的开头都加上一个防御分号,以便它能够 即使之前的声明被修改而且之前的声明也继续正常工作 终止分号已删除:
var x = 0 // Semicolon omitted here
;[x,x+1,x+2].forEach(console.log) // Defensive ; keeps this statement separate
来源:
答案 3 :(得分:9)
这被称为领先分号。
它的主要目的是保护自己免受以前不正确关闭的代码的影响,这可能会导致问题。分号可以防止这种情况发生。如果前面的代码未正确关闭,那么我们的分号将更正此问题。如果它被正确关闭,那么我们的分号将是无害的,并且没有副作用。
答案 4 :(得分:4)
当你缩小js代码时它很好。防止意外的语法错误。
答案 5 :(得分:4)
一行答案是安全地连接多个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(){})()