总结:
1.所谓的hoisting并不会移动代码,并不是真正意义上的“提升”,而是js引擎解释执行代码过程所带来的“特性”
2.V8引擎在解释执行js代码分为三个过程:AST => 字节码 => 机器码
3.在生成AST抽象语法树时,会经历词法分析阶段和语法分析阶段
4.词法分析阶段会将当前作用域中使用到的所有变量和函数声明提前添加到词法环境这个内存空间,对于var声明的变量初始值为undefined,对于function声明的函数初始值为函数对象(优先级function>var)
5.赋值语句在生成机器码阶段即真正在执行代码的时候才会进行
6.let、const声明其实也会在词法分析阶段将变量提前添加到词法环境中,但是不会初始化变量,在赋值操作之前调用变量会报错,即存在暂时性死区