作用域
作用域本身是一个抽象的概念,在定义时就已经创建好了
一、作用域的作用
- 隔离变量
- 规定当前函数之后创建的作用域链的上一条作用域链是什么样的
具体形式:[[scopes]]:上一级作用域链
二、作用域&执行上下文
了解两者的区别时,首先要了解什么是执行上下文
1.执行上下文
执行上下文代表了代码执行的环境,包括:执行环境,变量对象,this,作用域链
执行上下文是动态创建的,函数每调用一次就会创建一个执行上下文。
JS中栈结构保存变量,其实不太准备,栈结构中保存的是变量对象/执行上下文
执行上下文的流程
- JS引擎在JS代码正式执行之前会创建一个执行环境
- 进入该环境以后创建一个变量对象,该对象用于收集:变量、函数、函数的参数、this
前两步又被称为变量提升 - 确认this的指向
- 创建作用域链
举例画图说明:
var a=4;
var bar =function(x){
var b = 5;
foo(x+b);
}
var foo = function(y){
var c = 5;
console(c+y+a);
}
bar();
其在栈中存储情况如下
一块称为一个变量对象。
2.作用域和执行上下文的区别
作用域是静态态的,定义时就已经创建好了
执行上下文是动态的,调用时创建
三、作用域链
1.查找变量的流程
- 现在当前作用域的变量对象中查找,若无
- 沿着作用域链的数组去上级作用域的变量中查找
2.作用域链
- 作用域链是一个数组结构
- 结构内保存的是一个个变量对象
- JS代码正式执行之前创建
3.作用域链和执行上下文
全局Global的创建时间:
- 创建全局作用域
- 预解析
- 创建全局执行上下文
- 执行上下文环境
- 定义全局变量对象
注:此时并未定义作用域链
局部Local的创建时间:
- 创建作用域,定义的是上一级作用域链
- 执行函数的预解析
//调用的时候才会向下执行 - 创建局部执行上下文
- 定义局部变量对象
- 创建这一级的作用域链==[局部变量对象,上一级作用域链]