分号在自我调用功能之前?

7el*_*ant 98 javascript jquery

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

amo*_*ebe 162

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

文件A:

(function(){...A...})()
Run Code Online (Sandbox Code Playgroud)

档案B:

(function(){...B...})()
Run Code Online (Sandbox Code Playgroud)

文件A + B:

(function(){...A...})()(function(){...B...})()
Run Code Online (Sandbox Code Playgroud)

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

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

档案B2:

;(function(){...B2...})()
Run Code Online (Sandbox Code Playgroud)

你会得到一个有效的脚本:

(function(){...A...})();(function(){...B2...})()
Run Code Online (Sandbox Code Playgroud)

  • @ 7elephant 2分号不会伤害,但没有分号,所以这是一个安全问题,尤其适用于大型项目 (31认同)
  • 那么,为什么我更喜欢在自我调用函数面前而不是在它之后使用分号? (17认同)
  • 预防医学 (12认同)
  • 如果前一个语句没有以一个语句结尾,您是否还在每个语句的开头包含分号? (7认同)
  • @Brandon不,只在整个文件的前面.无论如何,连接文件中的语句应该用分号分隔,以创建有效的JavaScript代码. (3认同)

Mik*_*uel 28

自调用函数被括号括起来,并且在JavaScript中括号被重载为含义

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

在函数前面加一个分号可以防止函数在括号与函数应用程序混淆时变成前面的参数.

考虑

var x = 42

(function () { ... })()
Run Code Online (Sandbox Code Playgroud)

是相同的

var x = 42(function () { ... })()
Run Code Online (Sandbox Code Playgroud)

var x = 42

;

(function () { ... })()
Run Code Online (Sandbox Code Playgroud)

是相同的

var x = 42;

(function () { ... })()
Run Code Online (Sandbox Code Playgroud)

  • 只有在严重缩小时才会这样 (2认同)
  • @Neal它也等同于:尝试用`return 1'替换`...`然后在42之后添加分号并看到差异. (2认同)

小智 12

以无分号的方式编写所有 JavaScript.由于自动分号插入(ASI),在每行末尾没有分号的情况下写入时,有一些特殊情况首先会"混淆":

  1. 开始与操作者一个顶级表达式,一个((开括号)在这种情况下,像大多数其他运营商,可以继续以前的表达,从而抑制"分号的自动插入".(这通常在使用自调用函数时发生.)

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

因为我以无分号的方式编写,所以我总是把它写成(函数表达式自然可以跨越多行):

;(FunctionExpression)()
Run Code Online (Sandbox Code Playgroud)

我的情况下,它不是关于"安全"或试图"发现错误"(老实说,如果你的风格是使用分号并且你忘记了分号,那么你已经在其他地方创建了错误并且写了一;开始"安全"是hogwash).没有; 在我的情况下,它是为了与我所选择的风格的知识保持一致并且"知道" 与操作员开始一行可以继续前一行的表达.

请参阅JavaScript:分号插入(您需要了解的所有内容)以获取详细信息(这是迄今为止我在该主题上看到的最佳文章).

快乐的编码.

  • 你要求麻烦,真的,依靠什么本质上是一种机制来掩盖草率编程.分号是有原因的. (10认同)
  • @thepeer不,不,我不是真的.省略分号不是"草率编码".请备份这些毫无根据的主张; 在我的帖子中,我已经解释了以无分号风格编写时的"问题",并提供了如何编写*永远*与ASI有问题的代码的规则.然后我解释为什么它与"安全"无关,并提供一个覆盖细节的资源的链接(在链接中查找`return`生产).另一方面,引起这种反应的评论攻击了我的编码风格,并发表了一个我发现没有根据的陈述.不酷. (6认同)
  • @pst我没有责备你*编码; 原谅我,如果这是它的阅读方式.我的意思是js解析器自动插入分号的原因最初 - 就像其他一些js特征(未声明的变量变成全局的另一个) - 因为js被视为一种hack-ish语言,应该是宽恕编码实践的原谅.我知道有一个让分号更加严谨的运动更加严谨; 我反对它.事实上,我希望严格模式会在省略分号时抛出错误或至少发出警告. (5认同)
  • 关于“ick - 表达式中的副作用?”,编写大量 bash 的人往往会生成看起来像 bash 的 JS :) (2认同)