自动分号插入的标准是什么?

时间:2011-06-06 12:34:00

标签: javascript syntax

  

可能重复:
  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何时会自动插入分号。

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

2 个答案:

答案 0 :(得分:7)

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

  

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

     
      
  1. 当程序从左到右解析时,一个令牌(称为   遇到令人不快的令牌)   任何生产都不允许   语法,然后是分号   自动插入之前   违规令牌,如果一个或多个   以下条件为真:
      •   违规令牌与   先前的标记至少有一个   LineTerminator。
      •违规令牌   是}。
  2.   
  3. 当程序从左到右解析时,输入结束   遇到令牌流   解析器无法解析   输入令牌流作为单个   完成ECMAScript程序,然后a   分号自动插入   输入流的结束。
  4.   
  5. 当从左到右解析程序时,会遇到令牌   一些生产所允许的   语法,但生产是一个   限制生产和令牌   将是第一个令牌   终端或非终端立即   遵循注释“[no   LineTerminator这里]“内   限制生产(因此   这样的令牌被称为受限制   令牌),受限制的令牌是   与前一个标记分开   至少一个LineTerminator,然后一个   分号自动插入   在限制令牌之前。
  6.   

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

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

答案 1 :(得分:4)

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