在 JavaScript 中的自调用函数之前使用分号有什么好处?我在几个流行的 jQuery 插件中看到了这种方法,我很好奇这是否是 JavaScript 中我不知道的下一个很棒的东西。
自调用函数之前的分号?
如果将两个具有自调用函数的文件连接在一起,如下所示:
文件A:
(function(){...A...})()
文件乙:
(function(){...B...})()
文件 A+B:
(function(){...A...})()(function(){...B...})()
你有两个没有分隔符的语句。当您将文件放在一起然后缩小它们时会发生这种情况。
现在文件 B 的作者在前面放了一个分号:
文件 B2:
;(function(){...B2...})()
你会得到一个工作脚本:
(function(){...A...})();(function(){...B2...})()
自调用函数被括号包围,在 JavaScript 中括号被重载的意思是
- 分组表达式以覆盖优先级:
(x + y) * z
- 功能应用:
f()
当括号与函数应用程序混淆时,在函数前放置一个分号可以防止函数成为它前面任何内容的参数。
考虑
var x = 42
(function () { ... })()
是相同的
var x = 42(function () { ... })()
但
var x = 42
;
(function () { ... })()
是相同的
var x = 42;
(function () { ... })()
我以无分号的风格编写所有JavaScript。当每行末尾没有分号时,由于自动分号插入 (ASI),有一些特殊情况最初可能会“令人困惑”:
使用 operator 开始顶级表达式,
(
在这种情况下是一个(左括号),与大多数其他运算符一样,可以继续前一个表达式,从而抑制“自动插入分号”。(这通常仅在使用自调用函数时发生。)开个玩笑#2:没有!(只学习一个规则,你也可以享受没有额外分号的生活;-)
由于我以无分号的风格编写,因此我总是将其写为(函数表达式可以自然地跨越多行):
;(FunctionExpression)()
在我的情况下,这与“安全”或试图“捕捉错误”无关(老实说,如果您的风格是使用分号而您忘记了分号,那么您已经在其他地方创建了错误并编写a;
开头的“安全”是胡说八道)。不; 在我的情况下,这样做是为了与我选择的样式的知识保持一致,并且“知道”使用运算符开始一行可以从前一行继续表达式。
有关详细信息,请参阅JavaScript: Semicolon Insertion (Everything You Need To Know)(这是迄今为止我在该主题上看到的最好的文章)。
快乐编码。
对我来说,分号在 Internet Explorer 8 中触发了错误(或者至少 IETester 是这么说的),并阻止了 ui 选项卡正常工作。
错误消息是Invalid character in jquery.all.ui.js Line: 1. Char: 1
。
我完全偶然发现了分号。当我;
从;(function($)
它的工作中删除它时,似乎没有副作用或功能损失。我正在使用Drupal,不知道这是否与此事有关。