首页 > 其他 > 详细

作用域链

时间:2020-01-30 19:09:45      阅读:59      评论:0      收藏:0      [点我收藏+]
作用域链

解析器通过创建变量对象(Variable Object)来执行你的代码,VO 在函数体内也会创造 ,函数体内的 VO 我们称之为活动对象(Active Object)。

举个例子:

var a = 10;

function b (c, d) {
var x = 1;
}

对应的 VO

VO: {
a: 10
b: <function reference>
}

AO: {
c: undefined,
d: undefined
x: 1
}

AO 还额外存储了几个属性:

1. callee 指向自身函数
2. length 表示实参的长度(个数)
3. arguments 的索引(index)

每当函数执行的时候,便会创造一个执行期上下文(Execution Context),每个 EC 都有自己的作用域链(Scope),它的数据结构类似一个数组,当前的 AO 会被推入作用链最前端(with 例外)




作用域查找的规则是先查找当前 AO,然后向上查找 VO,直到最后到了 Global Object,还没有就报 undefined 的错

词法作用域(lexical scope)等同于静态作用域(static scope)。所谓的词法作用域其实是指作用域在词法解析阶段既确定了,不会改变。
我们要知道js是遵循静态作用域的。举个例子:
var foo=1;
function static(){
alert(foo);
}
!function(){
var foo=2;
static();
}();

在js中,会弹出1而非2,因为static的scope在创建时,记录的foo是1。
如果js是动态作用域,那么他应该弹出2。请体会一下两者的区别。
另外,借@贺师俊的话,eval 和 with可以产生动态作用域的效果

静态作用域(词法作用域):

function foo() {
print a; // 输出 2
}

function bar() {
var a = 3;
foo();
}

var a = 2;
bar();

动态作用域:

function foo() {
print a; // 输出 3 而不是2 !
}

function bar() {
var a = 3;
foo();
}

var a = 2;
bar();

词法作用域的函数中遇到既不是形参也不是函数内部定义的局部变量的变量时,去函数定义时的环境中查询。

动态域的函数中遇到既不是形参也不是函数内部定义的局部变量的变量时,到函数调用时的环境中查

作用域链

原文:https://www.cnblogs.com/chargeworld/p/12243485.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!