Solo  当前访客:0 开始使用

自动插入分号规则--ES5学习笔记(一)


1、ECMASCRIPT描述

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

  1. 左到右解析程序,当遇到一个不符合任何文法产生式的 token(叫做 违规 token(offending token)),那么只要满足下面条件之一就在违规 token 前面自动插入分号。
    • 至少一个 LineTerminator 分割了违规 token 和前一个 token。
    • 违规 token 是 }。
  2. 左到右解析程序,tokens 输入流已经结束,当解析器无法将输入 token 流解析成单个完整 ECMAScript 程序 ,那么就在输入流的结束位置自动插入分号。
  3. 左到右解析程序,遇到一个某些文法产生式允许的 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