注册分为三个阶段:分别是注册阶段,函数处理阶段,变量处理阶段;这三个阶段有先后顺序的。(注:这三个阶段的名字没有权威性,是作者为了方便记忆自己起的名字)
注册阶段的特征
1.此时不会运行代码
2.检查低级的语法错误
3.注册在当前词法环境中所声明的变量和函数
4.一旦创建了新的词法环境,就会执行这一阶段
函数处理阶段
如果是函数环境(也就是说局部环境):创建形参及函数参数的默认值;然后实参形参相统一。 如果全局环境,就跳过这这一步
接下来是全局环境和函数环境都经历的:将函数声明进行扫描并绑定到当前环境与函数名相同的标识符上。若该标识符已经存在,那么该标识符的值将被重写。(注意此时不会理会函数表达式和箭头函数)
对变量进行处理
若在全局作用域中或者函数作用域中。扫描三种变量 var 、let、const定义的变量。
若是块级作用域:扫描两种变量 let、const定义的变量。对于所查找到的变量,若该标识符不存在,进行注册并将其初始化为undefined。若该标识符已经存在,将保留其值。