理解JavaScript的执行环境,作用域链,以及变量对象(vo)和活动对象(ao)的区别?

一、JavaScript执行环境

1.什么是执行环境?

执行环境(Execution context 简称Ec)或执行上下文

2.执行环境分为三种:全局执行环境,函数执行环境,evel()执行环境

  (注意:JavaScript为每一个执行环境关联了一个变量对象;环境中定义的所有变量和函数都保存在这个对象中)

3.Execution context(Ec)的组成

当JavaScript代码执行的时候,会进入不同的执行环境(执行上下文),这些执行环境会构成了一个执行环境栈(执行上下文栈)(Execution context stack,ECS)。见下图:

理解JavaScript的执行环境,作用域链,以及变量对象(vo)和活动对象(ao)的区别?_第1张图片

4.什么是变量对象

变量对象(VO):变量对象即包含变量的对象,除了我们无法访问它外,和普通对象没什么区别。变量对象存储了在上下文中定义的变量和函数声明

5.变量对象(VO)和活动对象(AO)区别

一、活动对象和变量对象其实是一个东西,只是变量对象是规范上的或者说是引擎实现上的,不可在 JavaScript 环境中访问,只有到当进入一个执行上下文中,这个执行上下文的变量对象才会被激活,所以才叫 activation object。而只有被激活的变量对象,也就是活动对象上的各种属性才能被访问。

二、活动对象是在进入函数执行环境时刻被创建的,它通过函数的 arguments 属性初始化。arguments 属性值是 Arguments 对象。

6.变量对象(VO)和活动对象(AO)关系

未进入执行阶段之前,变量对象(VO)中的属性都不能访问!但是进入执行阶段之后,变量对象(VO)转变为了活动对象(AO),里面的属性都能被访问了,然后开始进行执行阶段的操作。它们其实都是同一个对象,只是处于执行环境的不同生命周期。

(注意:AO 实际上是包含了 VO 的。因为除了 VO 之外,AO 还包含函数的 parameters,以及 arguments 这个特殊对象。也就是说 AO 的确是在进入到执行阶段的时候被激活,但是激活的除了 VO 之外,还包括函数执行时传入的参数和 arguments 这个特殊对象。 AO = VO + function parameters + arguments)

7.执行环境分析

一、全局执行环境是最外围的执行环境,全局执行环境被认为是window对象,因此所有的全局变量和函数都作为window对象的属性和方法创建的。

二、js的执行顺序是根据函数的调用来决定的,当一个函数被调用时,该函数环境的变量对象就被压入一个环境栈中。而在函数执行之后,栈将该函数的变量对象弹出,把控制权交给之前的执行环境变量对象。

例子:

理解JavaScript的执行环境,作用域链,以及变量对象(vo)和活动对象(ao)的区别?_第2张图片

演示如下:

理解JavaScript的执行环境,作用域链,以及变量对象(vo)和活动对象(ao)的区别?_第3张图片

8.scope作用域

变量的作用域:全局变量和局部变量

全局作用域:最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的

局部作用域:局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的

9.scope作用域链

例子一:

理解JavaScript的执行环境,作用域链,以及变量对象(vo)和活动对象(ao)的区别?_第4张图片

理解JavaScript的执行环境,作用域链,以及变量对象(vo)和活动对象(ao)的区别?_第5张图片

解析:当某个函数第一次被调用时,就会创建一个执行环境(execution context)以及相应的作用域链,并把作用域链赋值给一个特殊的内部属性([scope])。然后使用this,arguments(arguments在全局环境中不存在)和其他命名参数的值来初始化函数的活动对象(activation object)。当前执行环境的变量对象始终在作用域链的第0位。以上述执行环境分析的小例子为例进行图解:当第一次调用fn1时。可以看到fn1活动对象里并没有scope变量,于是沿着作用域链(scope chain)向后寻找,结果在全局变量对象里找到了scope,所以就返回全局变量对象里的scope值。

例子二:

理解JavaScript的执行环境,作用域链,以及变量对象(vo)和活动对象(ao)的区别?_第6张图片

 

理解JavaScript的执行环境,作用域链,以及变量对象(vo)和活动对象(ao)的区别?_第7张图片

你可能感兴趣的:(理解JavaScript的执行环境,作用域链,以及变量对象(vo)和活动对象(ao)的区别?)