执行上下文
Step1 创建全局执行上下文,并加入栈顶
Step2 分析
- 找到所有的非函数中的var声明
- 找到所有的顶级函数声明(不在大括号内的函数声明)
- 找到顶级let,const,class声明
- 找到块中的声明,函数名不与上述重复
Step3 名字重复
- let,const,class声明的名字之间不能重发
- let声明的变量名不能重复
- const声明的变量名不能重复
- let和const声明的变量名不能重复
- let,const,class和var,function的名字不能重复
- let和var、function声明的变量名不能重复
- const和var、function声明的变量名不能重复
- var和function名字重复的,function声明的函数名优先
Step4 创建绑定
- 找到并初始化var和undefined
- 顶级函数声明:找到function名字,并初始化为新创建函数对象
- 块级中函数声明:找到名字,初始化为undefined
- 找到let,const,class,但未初始化
注意:
- var和function是创建在全局对象中的,而let,const,class是创建在全局scope中。
- 函数只有函数的scope,所以var,let,class,function等,全都创建在函数的scope中。
- 块中的函数声明:判断函数名和顶级的var,let,class,函数名,是否一样,如果一样不做任何处理,如果不一样就在全局对象中创建一个函数,并初始化为undefined。在退出代码块的时候,先把链接连回原来的文本环境,并在全局对象中查找有没有重复的名字,如果有,就把块中的值覆盖掉全局对象中的变量值,如果没有,不做任何处理。