自动分号插入的标准是什么? [重复]

问题描述 投票:1回答:2

可能重复: What are the rules for Javascript's automatic semicolon insertion?

JavaScript因其隐式行终止而迷惑我。它是一种非常类似C的语言,除了分号中的结尾行通常是可选的。

那么它如何决定何时采用行尾?

考虑这个例子:

var x = 1 + 2
-3 + 3 == 0 ? alert('0') : alert('3')

将其打入HTML文件并在Safari中打开它弹出3。如果在第一行的末尾粘贴分号,则会更改为0

算法和逻辑都很简单;我感兴趣的是JavaScript决定了什么标准,在这种情况下,不要假设第一行之后的行尾。它是否仅在假设EOL之前等待错误情况?还是有更明确的标准?

我很好奇。我没有研究过这么多;我想看看S / O社区对此有什么看法。无论如何,我总是用分号结束我的行,但是我有一些JS压缩代码,当我不经意地留下分号时会不时出现分号问题。

编辑

好的只是为了澄清实际问题在这里:任何人都可以用非抽象的术语描述JavaScript何时会自动插入分号。

这不是重复的。我知道自动分号插入的规则已经很好地建立并且简明扼要地记录下来。它们也是长篇大论而且令人困惑,因为它们通常是抽象的。根据我的经验,高级程序员不会消化低级文档以及简单的最终结果,这正是我正在寻找的。

javascript syntax
2个回答
7
投票

ECMA specification(第7.9.1节,第26页)指出:

分号插入有三个基本规则:

  1. 当从左到右解析程序时,遇到任何语法生成不允许的令牌(称为违规令牌),如果出现以下一个或多个,则在违规令牌之前自动插入分号条件是真的: •违规令牌通过至少一个LineTerminator与前一个令牌分开。 •违规令牌是}。
  2. 当从左到右解析程序时,遇到令牌输入流的末尾,并且解析器无法将输入令牌流解析为单个完整的ECMAScript程序,然后在结尾处自动插入分号输入流。
  3. 当从左到右解析程序时,遇到某些语法生成所允许的令牌,但是生产是限制生产,并且令牌将是紧跟注释之后的终端或非终端的第一个令牌在受限制的生产中“[没有LineTerminator]”(因此这样的令牌称为受限令牌),并且受限制的令牌通过至少一个LineTerminator与前一个令牌分开,然后在受限令牌之前自动插入分号。

我认为这个实现与第二点有关,其中:

var x = 1 + 2
-3 + 3 == 0 ? alert('0') : alert('3')

可以解析为一个完整的ECMAScript程序

因为解析器将如何插入分号并不总是很清楚,所以建议不要将它留给解析器(即总是自己插入分号)。

在ch。 7.9.2(自动分号插入的例子)相同的规格这个例子看起来像你的情况:

来源

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

自动分号插入不会转换,因为从第二行开始的括号表达式可以解释为函数调用的参数列表: a = b + c(d + e).print()


4
投票

不要将它留给编译器,总是在语句的末尾加上分号。

© www.soinside.com 2019 - 2024. All rights reserved.