可能重复:
Javascript的自动分号插入有哪些规则?
JavaScript因其隐式行终止而迷惑我.它是一种非常类似C的语言,除了分号中的结尾行通常是可选的.
那么它如何决定何时采用行尾?
考虑这个例子:
var x = 1 + 2
-3 + 3 == 0 ? alert('0') : alert('3')
Run Code Online (Sandbox Code Playgroud)
将其打入HTML文件并在Safari中打开它弹出3.如果在第一行的末尾粘贴分号,则会更改为0.
算法和逻辑都很简单; 我感兴趣的是JavaScript决定了什么标准,在这种情况下,不要假设第一行之后的行尾.它是否仅在假设EOL之前等待错误情况?还是有更明确的标准?
我很好奇.我没有研究过这么多; 我想看看S/O社区对此有什么看法.无论如何,我总是用分号结束我的行,但是我有一些JS压缩代码,当我不经意地留下分号时会不时出现分号问题.
编辑
好的只是为了澄清实际问题在这里:任何人都可以用非抽象的术语描述JavaScript何时会自动插入分号.
这不是重复的.我知道自动分号插入的规则已经很好地建立并且简明扼要地记录下来.它们也是长篇大论而且令人困惑,因为它们通常是抽象的.根据我的经验,高级程序员不会消化低级文档以及简单的最终结果,这正是我正在寻找的.
如果没有人感兴趣,那么当我有机会时,我会有机会回答自己.在此期间,请将枪支留在枪套中几天.谢谢.
在ECMA规范(7.9.1章,第26页)指出:
分号插入有三个基本规则:
- 当从左到右解析程序时,遇到任何语法生成不允许的令牌(称为违规令牌),如果出现以下一个或多个,则在违规令牌之前自动插入分号条件为真:
•违规令牌与前一个令牌至少由一个LineTerminator分隔.
•违规令牌是}.- 当从左到右解析程序时,遇到令牌输入流的末尾,并且解析器无法将输入令牌流解析为单个完整的ECMAScript程序,然后在结尾处自动插入分号输入流.
- 当从左到右解析程序时,会遇到某些语法生成所允许的令牌,但是生产是限制生产,并且令牌将是紧跟注释后的终端或非终端的第一个令牌限制生产中的"[没有LineTerminator]"(因此这样的令牌被称为受限令牌),并且受限令牌通过至少一个LineTerminator与前一个令牌分开,然后在受限令牌之前自动插入分号.
我认为这个实现与第二点有关,其中:
var x = 1 + 2
-3 + 3 == 0 ? alert('0') : alert('3')
Run Code Online (Sandbox Code Playgroud)
可以解析为一个完整的ECMAScript程序
因为并不总是清楚解析器如何插入分号,所以建议不要将它留给解析器(即总是自己插入分号).
在ch.7.9.2(自动分号插入的例子)相同的规格这个例子看起来像你的情况:
来源
a = b + c
(d + e).print()
Run Code Online (Sandbox Code Playgroud)
自动分号插入不会转换,因为从第二行开始的括号表达式可以解释为函数调用的参数列表:
a = b + c(d + e).print()
| 归档时间: |
|
| 查看次数: |
1968 次 |
| 最近记录: |