What does the leading semicolon in JavaScript libraries do?
在几个JavaScript库中,我在一开始就看到了这种符号:
1 2 3 4 5 | /** * Library XYZ */ ;(function () { // ... and so on |
虽然我对"立即执行的函数"语法非常满意
1 | (function(){...})() |
我想知道领先的分号是什么。 我能想到的是,它是一种保险。 也就是说,如果库嵌入在其他有缺陷的代码中,那么它就是"最后一个语句在最后结束"的速度缓冲。
它有任何其他功能吗?
它允许您安全地将多个JS文件连接成一个,以便作为一个HTTP请求更快地提供它。
最好的答案实际上是在问题中给出的,所以为了清楚起见,我会在这里写下来:
立即调用的函数表达式前面的前导
最佳做法是使用分号终止表达式,但也使用前导分号作为安全措施。
In general, if a statement begins with (, [, /, +, or -, there is a chance that it could be
interpreted as a continuation of the statement before. Statements beginning with /, +,
and - are quite rare in practice, but statements beginning with ( and [ are not uncommon
at all, at least in some styles of JavaScript programming. Some programmers like
to put a defensive semicolon at the beginning of any such statement so that it will
continue to work correctly even if the statement before it is modified and a previously
terminating semicolon removed:
1 2 | var x = 0 // Semicolon omitted here ;[x,x+1,x+2].forEach(console.log) // Defensive ; keeps this statement separate |
资源:
Javascript权威指南第6版
这被称为领先的分号。
它的主要目的是保护自己免受以前不正确关闭的代码的影响,这可能会导致问题。分号可以防止这种情况发生。如果前面的代码未正确关闭,那么我们的分号将更正此问题。如果它被正确关闭,那么我们的分号将是无害的,并且没有副作用。
一行答案是安全地连接多个javascript文件。
使用
假设您有多个功能
IIFE 1
1 2 3 | (function(){ //Rest of code })(); // Note it is a IIFE |
IIFE 2
1 2 3 | (function(){ // Rest of code })(); // Note it is also IIFE |
在连接上它可能看起来像
1 | (function(){})()(function(){})() |
但是如果你在函数之前添加一个
1 | ;(function(){})();(function(){})() |
因此,通过添加
例2
假设你有一个带变量的js文件
1 | var someVar ="myVar" |
另一个带有一些功能的js文件
1 | (function(){})() |
现在连接它看起来像
1 | var someVar ="myVar"(function(){})() // It may give rise to error |
使用
1 | var someVar ="myVar";(function(){})() |
当你缩小js代码时它很好。防止意外的语法错误。