分号自调函数之前?

在JavaScript中的自调用函数之前使用分号有什么好处。 我在几个stream行的jQuery插件中看到了这种方法,我很好奇,如果这是JavaScript中的下一个令人敬畏的东西,我不知道。 在此先感谢,伙计们!

如果将两个文件与自我调用函数连接在一起,如下所示:

文件A:

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

文件B:

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

文件A + B:

 (function(){...A...})()(function(){...B...})() 

你有两个没有分隔符的语句。 当您将文件放在一起然后缩小它们时,会发生这种情况。

现在文件B的作者在前面放了一个分号:

文件B2:

 ;(function(){...B2...})() 

你会得到一个工作脚本:

 (function(){...A...})();(function(){...B2...})() 

自调用函数被括号括起来,在JavaScript中括号被重载意味着

  1. 将expression式分组来覆盖优先级: (x + y) * z
  2. 函数应用: f()

在函数之前加上一个分号可以防止函数成为当括号与函数应用程序混淆之前的任何参数。

考虑

 var x = 42 (function () { ... })() 

是相同的

 var x = 42(function () { ... })() 

 var x = 42 ; (function () { ... })() 

是相同的

 var x = 42; (function () { ... })() 

用无分号的方式编写所有 JavaScript。 由于自动分号插入(ASI),在每行末尾都没有分号的情况下,有一些特殊情况起初可能会造成混淆:

  1. 用一个运算符开始一个顶级expression式,在这种情况下( (左括号), 像大多数其他运算符一样 ,可以继续前面的expression式,从而禁止“自动插入分号”(这通常只发生在使用自我调用function。)

  2. 开个玩笑,没有一个! (只学习一个规则,你也可以享受生活,没有额外的分号;-)

由于我用无分号格式编写,所以我总是把它写成(其中函数expression式自然可以跨越多行):

 ;(FunctionExpression)() 

我的情况下,这不是“安全”或试图“发现一个错误”(说实话,如果你的风格是使用分号,而你忘记了分号,那么你已经在其他地方创build了错误,并写作一个;在“安全”的开始是hogwash)。 没有; 在我的情况下,这是为了与我所选样式的知识 保持一致 ,并且“知道”: 用操作符开始一行可以继续前一行的expression式。

有关详细信息,请参阅JavaScript:分号插入(您需要了解的所有内容)(这是迄今为止关于此主题所见的最好的文章)。

快乐的编码。

对我而言,分号在Internet Explorer 8中引发了一个错误(至less这是IETester所说的),并且阻止了UI标签的正常工作。

错误消息是Invalid character in jquery.all.ui.js Line: 1. Char: 1 . Invalid character in jquery.all.ui.js Line: 1. Char: 1

我偶然偶然发现了分号。 当我删除了;;(function($)它的工作,似乎没有副作用或function的损失。我使用Drupal,不知道这是否与事情有关。