*JS:执行环境变量对象活动对象和作用域链
Posted jacksplwxy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了*JS:执行环境变量对象活动对象和作用域链相关的知识,希望对你有一定的参考价值。
var a=1; function b(x){ var c=2; console.log(x); } b(3);
·执行环境(execution context),也称为环境、执行上下文、上下文环境、执行上下文环境:
每次当控制器转到ECMAScript可执行代码的时候,即会进入到一个执行上下文。执行上下文(简称-EC)是
ECMA-262标准里的一个抽象概念,用于同可执行代码(executable code)概念进行区分。
通俗的话来讲就是,JS中的函数运行不能仅仅看函数内部有哪些变量,再简单的做运算就行了,而是执
行前需要根据函数所处的环境,如:变量、函数声明和arguments,来取值(在执行代码之前,把将要用到
的所有的变量都事先拿出来,有的直接赋值了,有的先用undefined占个坑)运算。
执行环境主要包含变量对象和作用域链两部分内容。
·变量对象(variable object):
变量对象属于执行环境的一部分,每个执行环境都有一个对象用来存储执行环境中的变量、函数声明和
arguments,这个对象就是执行环境的变量对象。
全局环境的变量对象始终存在,局部环境变量对象只有在函数执行的过程中存在,每个函数都有自己的
执行环境。
全局环境对象内容包括:var a=undefined、function b(){...}、this=windows。而像b()这样的的局
部变量对象内容包括了:var c=undefined、arguments=[3]、x=3、this=windows。
·活动对象(activation object):
在函数执行上下文中,VO是不能直接访问的,此时由活动对象(activation object,缩写为AO)扮演VO的
角色。
·作用域链:
function b(){}创建时,会创建一个预先包含全局变量的作用域链,这个作用域链被保存在[[Scope]]属
性中。当b()调用时会创建一个执行环境,然后通过复制函数的[[Scope]]属性中对象构建起执行环境的作用
域链。随后,又有一个活动对象(在此作为变量对象使用)被创建并推入执行环境作用域前端。对于这个例
子中的执行环境而言,其作用域链包括了2个变量对象:全局变量对象和其内部活动对象。
显然,作用域链是本质上是一个指向变量对象的指针列表,它只是引用但不实际包含变量对象。
·变量的搜索机制:
先搜索局部变量,如果没找到,往上一层查找,直到搜索全部变量,如果都没找到,返回undefined。
以上是关于*JS:执行环境变量对象活动对象和作用域链的主要内容,如果未能解决你的问题,请参考以下文章
1--面试总结-js深入理解,对象,原型链,构造函数,执行上下文堆栈,执行上下文,变量对象,活动对象,作用域链,闭包,This