企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### JS的预处理阶段 上述将的是解释器的整体过程,这里再提下在正式执行JS前,还会有一个预处理阶段 (譬如变量提升,分号补全等) 预处理阶段会做一些事情,确保JS可以正确执行,这里仅提部分: #### 分号补全 JS执行是需要分号的,但为什么以下语句却可以正常运行呢? ``` console.log('a') console.log('b') ``` 原因就是JS解释器有一个 [Semicolon Insertion](http://inimino.org/~inimino/blog/javascript_semicolons) 规则,它会按照一定规则,在适当的位置补充分号 譬如列举几条自动加分号的规则: - 当有换行符(包括含有换行符的多行注释),并且下一个 `token` 没法跟前面的语法匹配时,会自动补分号。 - 当有 `}` 时,如果缺少分号,会补分号。 - 程序源代码结束时,如果缺少分号,会补分号。 于是,上述的代码就变成了 ``` console.log('a'); console.log('b'); ``` 所以可以正常运行 当然了,这里有一个经典的例子: ``` function b() { return { a: 'a' }; } ``` 由于分号补全机制,所以它变成了: ``` function b() { return; { a: 'a' }; } ``` 所以运行后是`undefined` #### 变量提升 一般包括函数提升和变量提升 譬如: ``` a = 1; b(); function b() { console.log('b'); } var a; ``` 经过变量提升后,就变成: ``` function b() { console.log('b'); } var a; a = 1; b(); ``` 这里没有展开,其实展开也可以牵涉到很多内容的 譬如可以提下变量声明,函数声明,形参,实参的优先级顺序,以及es6中let有关的临时死区等