作用域链:词法作用域的实现机制就是作用域链(scopeChain)。作用域链是一套按名称查找(Name Lookup)的机制,首先在当前执行环境的 ActiveObject 中寻找,没找到,则顺着作用域链到父 ActiveObject 中寻找,一直找到全局调用对象(Global Object)
4、实体表示
解析模拟
估计,看到这儿,大家还是很朦胧吧,什么是语法分析树,语法分析树到底长什么样子,作用域链又怎么实现的,活动对象又有什么内容等等,还是不是太清晰,下面我们就通过一段实际的代码来模拟整个解析过程,我们就把语法分析树,活动对象实实在在的创建出来,理解作用域,作用域链的到底是怎么实现的 1、模拟代码
- /*全局(window)域下的一段代码*/
- var i = 1,j = 2,k = 3;
- function a(o,p,x,q){
- var x = 4;
- alert(i);
- function b(r,s) {
- var i = 11,y = 5;
- alert(i);
- function c(t){
- var z = 6;
- alert(i);
- };
- //函数表达式
- var d = function(){
- alert(y);
- };
- c(60);
- d();
- };
- b(40,50);
- }
- a(10,20,30);
2、语法分析树 上面的代码很简单,就是先定义了一些全局变量和全局方法,接着在方法内再定义局部变量和局部方法,现在JS解释器读入这段代码开始解析,前面提到 JS 引擎会先通过语法分析和预解析得到语法分析树,至于语法分析树长什么样儿,都有些什么信息,下面我们以一种简单的结构:一个 JS 对象(为了清晰表示个各种对象间的引用关系,这里的只是伪对象表示,可能无法运行)来描述语法分析树(这是我们比较熟悉的,实际结构我们不去深究,肯定复杂得多,这里是为了帮助理解解析过程而特意简化)
- /**
- * 模拟建立一棵语法分析树,存储function内的变量和方法
- */
- var SyntaxTree = {
- // 全局对象在语法分析树中的表示
- window: {
- variables:{
- i:{ value:1},
- j:{ value:2},
- k:{ value:3}
- },
- functions:{
- a: this.a
- }
- },
-
- a:{
- variables:{
- x:''undefined''
- },
- functions:{
- b: this.b
- },
- scope: this.window
- },
-
- b:{
- variables:{
- y:''undefined''
- },
- functions:{
- c: this.c,
- d: this.d
- },
- scope: this.a
- },
-
- c:{
- variables:{
- z:''undefined''
- },
- functions:{},
- scope: this.b
- },
-
- d:{
- variables:{},
- functions:{},
- scope: {
- myname:d,
- scope: this.b
- }
- }
- };
|