要编写没有分号的有效Javascript,我必须遵循哪些规则?
有很多关于“我应该使用分号吗?”和“分号注入如何工作?”的问题,但我想为一个决定尽可能避免使用分号的程序员找到免费的建议 如果有人(如或Bootstrap开发人员)选择编写不带分号的Javascript,他们必须在什么条件下添加分号,他们还应该做什么来确保他们的代码不会失败?避免意外地合并两行 假设您打算使用换行符代替分号,一个经常被忽略的错误是将两行代码组合成一个表达式的代码 例如,以下代码:要编写没有分号的有效Javascript,我必须遵循哪些规则?,javascript,syntax,Javascript,Syntax,有很多关于“我应该使用分号吗?”和“分号注入如何工作?”的问题,但我想为一个决定尽可能避免使用分号的程序员找到免费的建议 如果有人(如或Bootstrap开发人员)选择编写不带分号的Javascript,他们必须在什么条件下添加分号,他们还应该做什么来确保他们的代码不会失败?避免意外地合并两行 假设您打算使用换行符代替分号,一个经常被忽略的错误是将两行代码组合成一个表达式的代码 例如,以下代码: // DANGEROUS a = b + c (d + e).print() 将被解释
// 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)
因此,一般来说,建议遵循的规则是:
当一行以括号开始时(
或[
或者使用算术运算符+
-
*
/
或regexp/…/
然后在它前面加一个分号;
。
(但是请注意,++
--
和/
没有分号是安全的。)
(实际上,您永远不会单独编写*
或/
,因此以这种方式开始一行是没有意义的,但有时您可能希望以/…/
regexp开头一行。在这种情况下,如果不使用分号,很可能会导致语法分析错误。(
[
+
-
案例更危险,因为它们会导致运行时错误。)
资料来源:
- 我找到的
- 伊尼米诺的文章
- 前导分号将确保您的外圆括号
不会试图调用在您之前连接的脚本末尾的未终止表达式(…)
- 尾随分号是一种很好的做法,以防在您的脚本之后连接的脚本以IIFE开头,而忽略了以自己的分号开头
+
开头,不以(…)
包装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将检测上面提到的问题(他们还发布了一个if you like to use eslint,但我不确定这些规则有多全面)在
'use strict';
中,你需要分号。虽然规范中规定'use strict'
后面应该跟一个分号,但实际上没有分号,只要你遵守上面提到的规则。出于好奇,不使用分号会有什么好处?@MattR我刚刚打开了Bootstrap源代码de并注意到它看起来是多么干净。我在其他地方看到的分号都是视觉上的干扰,尽管很小。我感觉引导开发人员省略分号是为了让他们的代码看起来“聪明”,因为(我在那篇文章中找不到任何合理的论据).让我们引用Douglas Crockfords对bootstrap中这种做法的看法:嗨!我来自未来。我只想补充一点,bootstrap中缺少分号导致了一些后果:……很多……这些问题只是我可以很快找到的一些问题。尽管来自未来,你的一个链接已经被pr共享之前的评论。这两个问题都是迷你们修正的bug,这至少要感谢一个案例中的引导。开心!
x = obj[k]; delete obj[k]; return asChar(x)