自动插入分号规则--ES5学习笔记(一)
1、ECMASCRIPT描述
分号插入有三个基本规则:
- 左到右解析程序,当遇到一个不符合任何文法产生式的 token(叫做 违规 token(offending token)),那么只要满足下面条件之一就在违规 token 前面自动插入分号。
- 至少一个 LineTerminator 分割了违规 token 和前一个 token。
- 违规 token 是 }。
- 左到右解析程序,tokens 输入流已经结束,当解析器无法将输入 token 流解析成单个完整 ECMAScript 程序 ,那么就在输入流的结束位置自动插入分号。
- 左到右解析程序,遇到一个某些文法产生式允许的 token,但是此产生式是受限产生式,受限产生式的里紧跟在 no LineTerminator here 后的第一个终结符或非终结符的 token 叫做受限的 token,当至少一个 LineTerminator 分割了受限的 token 和前一个 token,那么就在受限 token 前面自动插入分号。
然而,上述规则有一个附加的优先条件:如果插入分号后解析结果是空语句,或如果插入分号后它成为 for 语句头部的两个分号之一(),那么不会自动插入分号。
2、详解规则
当缺少分号无法正常解析代码的时候,自动补全
var a a = 3 console.log(a)
--在var a后补全了分号,此语句结果为3
同样如果两行代码可被正常解析,则不会自动补全
var a = c+b (f+e).toString()
--代码最终被解析成 var a = c+b(f+e).toString; 第一行的b+第二行的()组成了函数调用
一般来说:以‘(',','[’,'/','+','-'开始的语句,很可能会和前一条一起解析
在出现受限的 token时,自动补全的情况
1)涉及到'++','--'运算符
如果将该运算符作为后缀,则需与表达式处于同一行!!
var a=3,b=4; a -- b console.log(a);//3 console.log(b);//3
--在第二行a后自动补全了‘;’。--与第四行的b组成了 --b运算表达式
2)涉及到return、continue、break语句时
function ac(){ return {a:1} }ac();//undefined
-- return后自动补全了‘;’
标题:自动插入分号规则--ES5学习笔记(一)
作者:hugh0524
地址:https://blog.uproject.cn/articles/2016/06/21/1466480600703.html
0 0