Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
要编写没有分号的有效Javascript,我必须遵循哪些规则?_Javascript_Syntax - Fatal编程技术网

要编写没有分号的有效Javascript,我必须遵循哪些规则?

要编写没有分号的有效Javascript,我必须遵循哪些规则?,javascript,syntax,Javascript,Syntax,有很多关于“我应该使用分号吗?”和“分号注入如何工作?”的问题,但我想为一个决定尽可能避免使用分号的程序员找到免费的建议 如果有人(如或Bootstrap开发人员)选择编写不带分号的Javascript,他们必须在什么条件下添加分号,他们还应该做什么来确保他们的代码不会失败?避免意外地合并两行 假设您打算使用换行符代替分号,一个经常被忽略的错误是将两行代码组合成一个表达式的代码 例如,以下代码: // DANGEROUS a = b + c (d + e).print() 将被解释

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

如果有人(如或Bootstrap开发人员)选择编写不带分号的Javascript,他们必须在什么条件下添加分号,他们还应该做什么来确保他们的代码不会失败?

避免意外地合并两行 假设您打算使用换行符代替分号,一个经常被忽略的错误是将两行代码组合成一个表达式的代码

例如,以下代码:

  // 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)