作用域、作用域链与执行上下文


作用域

作用域本身是一个抽象的概念,在定义时就已经创建好了

一、作用域的作用

  1. 隔离变量
  2. 规定当前函数之后创建的作用域链的上一条作用域链是什么样的
    具体形式:[[scopes]]:上一级作用域链

二、作用域&执行上下文

了解两者的区别时,首先要了解什么是执行上下文

1.执行上下文

执行上下文代表了代码执行的环境,包括:执行环境,变量对象,this,作用域链
执行上下文是动态创建的,函数每调用一次就会创建一个执行上下文。

JS中栈结构保存变量,其实不太准备,栈结构中保存的是变量对象/执行上下文

执行上下文的流程

  1. JS引擎在JS代码正式执行之前会创建一个执行环境
  2. 进入该环境以后创建一个变量对象,该对象用于收集:变量、函数、函数的参数、this
    前两步又被称为变量提升
  3. 确认this的指向
  4. 创建作用域链

举例画图说明:

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.查找变量的流程

  1. 现在当前作用域的变量对象中查找,若无
  2. 沿着作用域链的数组去上级作用域的变量中查找

2.作用域链

  1. 作用域链是一个数组结构
  2. 结构内保存的是一个个变量对象
  3. JS代码正式执行之前创建

3.作用域链和执行上下文

全局Global的创建时间:

  1. 创建全局作用域
  2. 预解析
  3. 创建全局执行上下文
  4. 执行上下文环境
  5. 定义全局变量对象

注:此时并未定义作用域链


局部Local的创建时间:

  1. 创建作用域,定义的是上一级作用域链
  2. 执行函数的预解析
    //调用的时候才会向下执行
  3. 创建局部执行上下文
  4. 定义局部变量对象
  5. 创建这一级的作用域链==[局部变量对象,上一级作用域链]
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值