执行的上下文
程序在解析和运行的时候所依赖和使用的环境
- 全局执行上下文环境和函数执行上下文(全局环境和函数环境)
执行上下文栈
- 程序为了管理执行上下文,所创建耳朵栈数据结构
预解析(变量提升)
- 先解析函数,函数重名覆盖
- 再解析变量,变量重名忽略(声明会被忽略但是赋值还是存在的)
作用域
-
变量起作用的范围
- 函数定义在哪它的作用域就在那
-
作用域隔离变量,防止变量名被污染
-
作用域定义时候确定
作用域链
- 是真实存在的,作用域链是使用执行上下文当中变量对象组成的链条结构(数组结构)
- 查找的时候起始真正是先去自身变量对象中查找,如果没有,就去上级执行上下文的变量对象中查找,知道找到全局执行上下文
- 内部函数没有对外部函数没有对外部函数的局部变量时,外部函数的变量对象是不会出现在内部函数的作用域链上的(引用关系)
全局执行上下文
- 创建阶段和执行阶段
- 全局执行上下文压入执行上下文栈
- 创建执行上下文阶段:
- 1、收集变量形成的变量对象(函数、var的变量会收集)
- 2、确定this指向
- 3、创建自身执行上下文作用域链
- 创建执行上下文阶段:
- 执行管局上下文执行上下文
- 执行全局上下文阶段
- 为变量真正赋值
- 看作用域链查找和使用的变量或函数执行
- 执行全局上下文阶段
函数执行上下文
-
1、函数执行上下文压栈
- 1、收集变量(var、arguments、形参、函数)
- 2、确认this指向
- 3、创建自身执行的上下文的作用域(同时确定函数调用的时候的上级作用域链)
函数的作用域链:自己顶一的时候已经确定了函数在调用的时候的上级作用域链,因此,再函数调用的时候,需要讲自己的变量对象添加到上级作用域链的顶端,就形成了自己的作用域链
-
2、执行函数执行上下文
- 为变量真正赋值
- 顺着作用域链查找要使用的变脸或者函数执行
创建全局执行上下文——全局执行上下文压栈——执行全局执行上下文——创建函数执行上下文——
函数执行上下文压栈——执行函数执行上下文——函数执行上下文出栈——执行全局执行上下文——全局执行上下文出栈