自动插入分号的条件是什么

What are the criteria for automatic semicolon insertion?

本文关键字:条件 是什么 插入      更新时间:2023-09-26

可能重复:
Javascript的规则是什么;s自动插入分号?

JavaScript隐含的行终止让我困惑。这是一种非常类似C的语言,只是以分号结尾的行通常是可选的。

那么,它是如何决定何时假设结束的呢?

考虑这个例子:

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

将其插入HTML文件并在Safari中打开,会弹出3。如果在第一行的末尾加上分号,它将变为0

算法和逻辑都很简单;我感兴趣的是,在本例中,JavaScript根据什么标准决定不在第一行之后假设行的末尾。是不是在假设EOL之前只等待错误场景?还是有更明确的标准?

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

编辑

好的,只是澄清一下这里的实际问题:有人能用非抽象术语描述JavaScript何时会自动插入分号吗。

这不是重复的。我知道自动分号插入的规则已经建立好,并且文档简洁。它们也很冗长和令人困惑,因为它们通常都是抽象的。根据我的经验,高级程序员不会像消化简单的最终结果那样消化低级别文档,这正是我想要的。

ECMA规范(第26页第7.9.1章)规定:

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

  1. 当程序从左到右解析时,一个令牌(称为违规令牌)不允许生产语法,则分号为自动插入如果以下条件成立:
    •有问题的令牌与至少一个以前的令牌线路端接器
    •违规代币是}
  2. 当程序从左到右解析时,输入的末尾遇到令牌流,并且解析程序无法解析将令牌流作为单个输入完成ECMAScript程序,然后分号自动插入输入流的末尾
  3. 当从左到右解析程序时,遇到令牌这是某些生产所允许的语法,但生产是限制生产和代币将是立即终止或非终止在注释"[否LineTerminator here]"限制生产(因此这样的令牌被称为受限令牌令牌),并且受限令牌是与上一个令牌分隔开至少一个线路终止器,然后分号是自动插入的在受限令牌之前

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

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

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