在几个JavaScript库中,我在一开始就看到了这种表示法:
/**
* Library XYZ
*/
;(function () {
// ... and so on
虽然我对“立即执行的功能”语法完全满意
(function(){...})()
我想知道领先的分号是做什么用的。我所能想到的就是这是一种保险。也就是说,如果该库嵌入其他错误代码中,则它充当“最后一条语句最迟在此处结束”的减速方式。
它还有其他功能吗?
在几个JavaScript库中,我在一开始就看到了这种表示法:
/**
* Library XYZ
*/
;(function () {
// ... and so on
虽然我对“立即执行的功能”语法完全满意
(function(){...})()
我想知道领先的分号是做什么用的。我所能想到的就是这是一种保险。也就是说,如果该库嵌入其他错误代码中,则它充当“最后一条语句最迟在此处结束”的减速方式。
它还有其他功能吗?
Answers:
它使您可以安全地将多个JavaScript文件连接到一个文件中,以将其作为一个HTTP请求更快地提供服务。
(function(){...})()(function(){...})()
。
最佳答案实际上是在问题中给出的,因此为了清楚起见,我将其写在这里:
;
立即调用的函数表达式的前导是为了防止在串联过程中将文件追加到包含未正确以终止的表达式的文件时出错;
。
最佳做法是用分号终止表达式,但也要使用前导的分号作为保护措施。
"\n"
有";\n"
没有意义。
通常,如果一条语句以(,[,/,+或-开头,则有可能将其解释为之前的语句的延续。 ,但至少在某些JavaScript编程风格中,以(和[开头的语句并不罕见。一些程序员喜欢在任何此类语句的开头加上一个防御性的分号,以便即使该语句也可以继续正常工作。在对其进行修改并删除先前终止的分号之前:
var x = 0 // Semicolon omitted here
;[x,x+1,x+2].forEach(console.log) // Defensive ; keeps this statement separate
资源:
单行答案是安全地串联多个JavaScript文件。使用分号不会引起问题。
假设您具有多种功能:
IIFE 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(){})()
因此,通过添加;
,可以确保是否未正确终止任何表达式。
例子2
假设您有一个带变量的JavaScript文件:
var someVar = "myVar"
另一个具有某些功能的JavaScript文件:
(function(){})()
现在在串联时,它看起来像
var someVar = "myVar"(function(){})() // It may give rise to an error
使用分号,它将看起来像:
var someVar = "myVar";(function(){})()
当您最小化JavaScript代码时,这很好。它可以防止意外的语法错误。