作用域作用域链变量函数提升

1、作用域

  作用域经常被用来配合js引擎去查询访问权限。比如js引擎想要调用某一个变量就会先询问作用域自己能否取到该变量。得到作用域的许可后再执行后续步骤。引擎负责从头到尾整个js程序的编译和执行过程。
  所以作用域是负责收集、维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限

作用域定义:
  [[scope]] 作用域, 存储多个执行期上下文的集合。

作用域分类:
  全局作用域
  函数(局部)作用域

[[scope]] 作用域也是一种属性,但是该作用域属性只能被js引擎使用,无法被对象调用。
那么scope里面到底是怎们存作用域的呢?其实[[scope]]里链接着scope chain ——作用域链,作用域链里链接着当前对象的运行期上下文对象,也就是代码运行之前提前预编译准备好的环境。这些环境就是具体的作用域。

运行期上下文
当运行代码时就会创建一个运行期上下文,运行期上下文就是预编译产生的,在代码真正被执行前创建好全局运行环境(将变量提升,函数提升)和代码块被调用时创建好局部作用域环境。上面的两种环境分别对应着两个对象,一个是AO对象(Activation Object 活跃对象) 一个是Go对象(Global Object 全局对象)。

  生成GO
  编译时首先创建一个go全局对象(代码执行前),存入scope chain栈中。将所有已声明的变量和函数放进对象中,但是不会对变量赋值,仅仅为undefined状态。函数也仅仅声明一个函数不会对函数内部变量等进行声明。这就是函数提升,变量提升。

  生成AO
  在代码执行时才会为该函数创建一个ao对象并将其压入栈中,由于栈是先进先出,所以此时,ao首先会对已声明的变量,形参和函数体中的函数进行声明和undefined,然后当代码执行到函数时ao会进行实参和形参的统一,将形参赋值,接着是对代码的运行并随之赋值。当函数执行完毕后会立即销毁ao对象,所以每次函数执行都会创建一个不同的变量等与之前完全不同。
函数作用域链中会在声明时就创建一个作用域链并将go对象链接到作用域中,在函数执行时在压入go对象。当函数执行完ao销毁,go并不会销毁,等待函数下次执行再次创建ao对象。

变量查找
变量是按照作用域链链接的运行期的上下文顺序查找的。也就是到被作用域链链接的ao go 对象中查找是否有声明的变量,有js引擎就会对其访问使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值