自调用函数之前的分号?

IT技术 javascript jquery
2021-02-01 18:11:49

在 JavaScript 中的自调用函数之前使用分号有什么好处?我在几个流行的 jQuery 插件中看到了这种方法,我很好奇这是否是 JavaScript 中我不知道的下一个很棒的东西。

4个回答

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

文件A:

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

文件乙:

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

文件 A+B:

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

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

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

文件 B2:

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

你会得到一个工作脚本:

(function(){...A...})();(function(){...B2...})()
预防医学
2021-03-16 18:11:49
@Brandon 不,只在整个文件前面。串联文件中的语句无论如何都应该用分号分隔以创建有效的 JavaScript 代码。
2021-03-22 18:11:49
您是否还在每条语句的开头包含一个分号,以防前一条语句不以分号结尾?
2021-04-01 18:11:49
@7elephant 2 分号不会造成伤害,但没有分号会造成伤害,因此这是一个安全问题,尤其与大型项目相关
2021-04-06 18:11:49
那么,为什么我应该更喜欢在自调用函数前面而不是在它后面的分号?
2021-04-11 18:11:49

自调用函数被括号包围,在 JavaScript 中括号被重载的意思是

  1. 分组表达式以覆盖优先级: (x + y) * z
  2. 功能应用: f()

当括号与函数应用程序混淆时,在函数前放置一个分号可以防止函数成为它前面任何内容的参数。

考虑

var x = 42

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

是相同的

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

var x = 42

;

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

是相同的

var x = 42;

(function () { ... })()
很有意思。我为@Josh 所说的内容创建了一个小提琴,这样我就可以亲眼看看会发生什么:http : //jsfiddle.net/LK63x/
2021-03-22 18:11:49
@尼尔,是的。jsfiddle.net/vZvfG所示,换行符与它无关换行符仅影响JS 中的受限产生式return, this, ++, --, break, continue
2021-03-22 18:11:49
@Neal,你能解释一下吗?我认为缩小与此完全正交。
2021-03-27 18:11:49
只有在严重缩小时
2021-04-05 18:11:49
@Neal 其他方面也等效:尝试替换为...return 1然后在 42 之后添加分号,看看有什么不同。
2021-04-08 18:11:49

以无分号的风格编写所有JavaScript。当每行末尾没有分号时,由于自动分号插入 (ASI),有一些特殊情况最初可能会“令人困惑”:

  1. 使用 operator 开始顶级表达式,(在这种情况下是一个(左括号),与大多数其他运算符一样,可以继续前一个表达式,从而抑制“自动插入分号”。(这通常在使用自调用函数时发生。)

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

由于我以无分号的风格编写,因此我总是将其写为(函数表达式可以自然地跨越多行):

;(FunctionExpression)()

我的情况下,这与“安全”或试图“捕捉错误”无关(老实说,如果您的风格是使用分号而您忘记了分号,那么您已经在其他地方创建了错误并编写a;开头的“安全”是胡说八道)。不; 在我的情况下,这样做是为了我选择的样式的知识保持一致并且“知道”使用运算符开始一行可以从前一行继续表达式。

有关详细信息,请参阅JavaScript: Semicolon Insertion (Everything You Need To Know)(这是迄今为止我在该主题上看到的最好的文章)。

快乐编码。

你是在自找麻烦,真的,依靠本质上是一种掩盖草率编程的机制。分号的存在是有原因的。
2021-03-18 18:11:49
关于“ick - 表达式中的副作用?”,编写大量 bash 的人倾向于生成看起来像 bash 的 JS :)
2021-03-20 18:11:49
@thepeer 虽然我在有关 ASI 的其他问题中解决了不同的“安全”问题,但在这个特定的答案中,我声称在需要分号的样式中省略任何分号不正确和不安全的- 特别是因为一个分号并不总是为连续行做好准备,就像一个(像我一样)写无分号风格的人。因此,这两种方法在“安全”方面没有区别。现在,分号的一大优势是,如果不使用分号,许多工具/格式化程序会感到困惑。不是与“草率的编码”,但涉及到的工具。
2021-03-22 18:11:49
@pst 我不是在指责编码马虎;如果它是这样读的,请原谅我。我的意思是 js 解析器自动插入分号的原因最初是 - 就像其他一些 js 功能(未声明的变量变为全局是另一个) - 因为 js 被视为一种黑客语言,应该原谅草率的编码实践。我知道有一种运动使无分号的 js 更加严格;我反对。事实上,我希望严格模式在省略分号时会引发错误或至少是警告。
2021-04-01 18:11:49
@thepeer 不,不,我不是真的。省略分号不是“草率编码”。请支持这种毫无根据的主张;在我的帖子中,我解释了以无分号风格编写时的“问题”是什么,并提供了关于如何编写永远不会出现 ASI 问题的代码的规则然后我解释为什么它与“安全”无关,并提供一个指向涵盖细节的资源的链接(return在链接中查找生产)。另一方面,引起这种反应的评论攻击了我的编码风格,并发表了我认为毫无根据的声明。不酷。
2021-04-08 18:11:49

对我来说,分号在 Internet Explorer 8 中触发了错误(或者至少 IETester 是这么说的),并阻止了 ui 选项卡正常工作。

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

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