### 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有关的临时死区等
- Web 开发笔记
- 从输入 URL 到页面加载完成的过程中都发生了什么事情?
- 从浏览器接收url到开启网络请求线程
- 开启网络线程到发出一个完整的http请求
- 从服务器接收到请求到对应后台接收到请求
- 后台和前台的http交互
- http的缓存
- 解析页面流程
- HTML解析,构建DOM
- CSS解析,构建CSSOM
- 资源外链的下载
- CSS的可视化格式模型
- 包含块(Containing Block)
- 控制框(Controlling Box)
- BFC(Block Formatting Context)
- IFC(Inline Formatting Context)
- 其它
- JS引擎解析过程
- JS的解释阶段
- JS的预处理阶段
- JS的执行阶段
- 回收机制
- 参考资料
- JavaScript模块化编程
- AMD
- requireJS
- CommonJS
- UMD
- ES6模块
- 参考资料
- 使用 JavaScript 实现一门编程语言
- 如何使用 JavaScript 实现一门编程语言(1) —— 前言
- 如何使用 JavaScript 实现一门编程语言(2) —— 编写一个解析器
- 如何使用 JavaScript 实现一门编程语言(3) —— Input stream
- 如何使用 JavaScript 实现一门编程语言(4) —— Token stream
- 如何使用 JavaScript 实现一门编程语言(5) —— AST
- 如何使用 JavaScript 实现一门编程语言(6) —— Interpreter
- 完整代码
- 参考资料
- 前端布局概论
- 参考资料
- Windows 笔记
- 错误解决
- win10应用商店无法登录提示0x80070426解决方法
- 使用技巧
- 设置 Hyper-V 和 VMware 共存
- Powershell
- WSL