【问题标题】:What rules must I follow to write valid Javascript without semicolons?我必须遵循哪些规则才能编写不带分号的有效 Javascript?
【发布时间】:2014-08-01 21:06:29
【问题描述】:

关于“我应该使用分号吗?”有很多问题。和“分号注入是如何工作的?”,但我想为一个决定尽可能避免使用分号的程序员找到无 FUD 的建议。

如果有人像 izs 或 Bootstrap 开发人员一样选择编写不带分号的 Javascript,在什么条件下必须他们添加分号,以及他们应该做些什么来确保他们的代码能够不会失败?

【问题讨论】:

  • 只是出于好奇,不使用它们有什么好处?
  • @MattR 我刚刚打开了 Bootstrap 源代码,发现它看起来多么干净。我在其他地方看到的分号有点分散视觉注意力,尽管很小。
  • 我感觉引导开发人员省略了分号以使他们的代码看起来“聪明”,因为they just like it this way(我在那篇文章中找不到任何合理的论点)。让我们在引导程序中引用 Douglas Crockfords 对这种做法的看法:"That is insanely stupid code."
  • 嗨!我来自未来。只是想补充一点,引导程序上缺少分号导致了一些后果:github.com/twbs/bootstrap/issues/3057 ...很多。 github.com/twbs/bootstrap/issues/4699github.com/twbs/bootstrap/issues/1905。这些问题只是我可以快速找到的一些问题。
  • 尽管来自未来,但您的其中一个链接已被之前的评论者分享。这两个问题都是修复了缩小器的错误,这至少在一种情况下要感谢 Bootstrap。快乐2016

标签: javascript syntax


【解决方案1】:

避免意外合并两行

假设您打算使用换行符代替分号,一个经常被忽视的错误是将两行代码组合成一个表达式。

例如下面的代码:

  // DANGEROUS
  a = b + c
  (d + e).print()

将被解释为:

  a = b + c(d + e).print()

解决办法是:

  // SAFE
  a = b + c
  ;(d + e).print()

类似的问题出现在:

  // DANGEROUS
  console.log()
  ['three', 'two', 'one'].forEach(console.log)

所以总的来说,建议遵循的规则是:

一行以括号开头时([

或使用算术运算符 + - * / 或正则表达式 /.../

然后在它前面加上一个分号;

(但请注意,++ --// 在没有分号的情况下是安全的。)

(您实际上永远不会单独编写 */,因此以这种方式开始一行是没有意义的,但您有时可能希望以 /.../ 正则表达式开始一行。在那个情况下,如果不使用分号,这很可能会导致语法解析错误。([+- 情况更危险,因为它们会导致运行时错误。)

来源:

避免在开始和结束时合并连接的文件

出于类似的原因,分号也是可取的库脚本的开头和结尾,它将被释放到野外。事实上,无论您在脚本中使用什么样式,都建议这样做。

在这个例子中,IIFE:

  // my-library.js
  ;(function(){
      ...
  })();
  • 前导分号将确保您的外圆括号(...) 不会尝试在您之前连接的脚本末尾处调用未终止的表达式。

  • 尾随分号是一种很好的做法,以防在您的脚本之后连接的脚本以 IIFE 开头并且忽略以自己的分号开头。

作为替代方案,Bootstrap 以 + 开头,不将 IIFE 包装在 (...) 中,并以 ; 结尾。其他变体以! 开头,而不是+;

分号正常的地方

唯一需要分号的其他时间是在传统的 for 循环中

  for (var i = 0; i < 10; i++) { // good luck doing that without semicolons!

当您以其他方式在一行中放置多个语句时:

  x = obj[k]; delete obj[k]; return asChar(x)

使用 linter

一些 linter 会检测到您的代码何时可能产生意想不到的后果,并鼓励您遵循上述做法。

例如,所谓的standardjs linter 会检测到上面提出的问题。 (如果你更喜欢使用 eslint,他们还发布了 eslint config,但我不确定这些规则有多全面。)

【讨论】:

  • 'use strict';,你需要分号。
  • 虽然在规范中写到'use strict' 后面应该跟一个分号,但实际上it works fine 没有分号,前提是您遵循上述规则。
猜你喜欢
  • 2021-10-22
  • 2012-10-25
  • 1970-01-01
  • 2011-05-07
  • 2010-09-13
  • 2012-02-25
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多