JavaScript库中领先的分号有什么作用?

2020/11/02 22:42 · javascript ·  · 0评论

在几个JavaScript库中,我在一开始就看到了这种表示法:

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

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

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

我想知道领先的分号是做什么用的。我所能想到的就是这是一种保险。也就是说,如果该库嵌入其他错误代码中,则它充当“最后一条语句最迟在此处结束”的减速方式。

它还有其他功能吗?

它使您可以安全地将多个JavaScript文件连接为一个,以便将其作为一个HTTP请求更快地提供服务。

最佳答案实际上是在问题中给出的,因此为了清楚起见,我将其写在这里:

;立即调用的函数表达式的前导是为了防止在串联过程中将文件追加到包含未正确以终止的表达式的文件时出错;

最佳实践是用分号终止表达式,但也要使用前导的分号作为保护措施。

通常,如果一条语句以(,[,/,+或-开头,则有可能将其解释为该语句之前的延续。 ,但至少在某些JavaScript编程风格中,以(和[开头的语句并不罕见。一些程序员喜欢在任何此类语句的开头加上一个防分号,以便即使该语句在对其进行修改并删除先前终止的分号之前:

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

资源:

JavaScript:权威指南,第6版

这被称为前导分号。

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

单行答案是安全地串联多个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代码时,这很好。它可以防止意外的语法错误。

本文地址:http://javascript.askforanswer.com/javascriptkuzhonglingxiandefenhaoyoushenmezuoyong.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!