快速业务通道

JS教程:词法作用域和闭包

作者 佚名技术 来源 网页制作 浏览 发布时间 2012-03-06
  • 作用域链:词法作用域的实现机制就是作用域链(scopeChain)。作用域链是一套按名称查找(Name Lookup)的机制,首先在当前执行环境的 ActiveObject 中寻找,没找到,则顺着作用域链到父 ActiveObject 中寻找,一直找到全局调用对象(Global Object)
  • 4、实体表示
    源码,语法分析树,执行环境和活动对象的引用关系

    解析模拟

    估计,看到这儿,大家还是很朦胧吧,什么是语法分析树,语法分析树到底长什么样子,作用域链又怎么实现的,活动对象又有什么内容等等,还是不是太清晰,下面我们就通过一段实际的代码来模拟整个解析过程,我们就把语法分析树,活动对象实实在在的创建出来,理解作用域,作用域链的到底是怎么实现的
    1、模拟代码

    1. /*全局(window)域下的一段代码*/
    2. var i = 1,j = 2,k = 3;
    3. function a(o,p,x,q){
    4.     var x = 4;
    5.         alert(i);
    6.     function b(r,s) {
    7.         var i = 11,y = 5;
    8.             alert(i);
    9.         function c(t){
    10.           var z = 6;
    11.                 alert(i);
    12.         };
    13.             //函数表达式
    14.         var d = function(){
    15.                 alert(y);
    16.             };
    17.             c(60);
    18.             d();
    19.     };
    20.         b(40,50);
    21. }
    22. a(10,20,30);

    2、语法分析树
    上面的代码很简单,就是先定义了一些全局变量和全局方法,接着在方法内再定义局部变量和局部方法,现在JS解释器读入这段代码开始解析,前面提到 JS 引擎会先通过语法分析和预解析得到语法分析树,至于语法分析树长什么样儿,都有些什么信息,下面我们以一种简单的结构:一个 JS 对象(为了清晰表示个各种对象间的引用关系,这里的只是伪对象表示,可能无法运行)来描述语法分析树(这是我们比较熟悉的,实际结构我们不去深究,肯定复杂得多,这里是为了帮助理解解析过程而特意简化)

    1. /**
    2. * 模拟建立一棵语法分析树,存储function内的变量和方法
    3. */
    4. var SyntaxTree = {
    5.         // 全局对象在语法分析树中的表示
    6.     window: {
    7.         variables:{
    8.             i:{ value:1},
    9.             j:{ value:2},
    10.             k:{ value:3}
    11.         },
    12.         functions:{
    13.             a: this.a
    14.         }
    15.     },
    16.  
    17.     a:{
    18.         variables:{
    19.             x:''undefined''
    20.         },
    21.         functions:{
    22.             b: this.b
    23.         },
    24.         scope: this.window
    25.     },
    26.  
    27.     b:{
    28.         variables:{
    29.             y:''undefined''
    30.         },
    31.         functions:{
    32.             c: this.c,
    33.             d: this.d
    34.         },
    35.         scope: this.a
    36.     },
    37.  
    38.     c:{
    39.         variables:{
    40.             z:''undefined''
    41.         },
    42.         functions:{},
    43.         scope: this.b
    44.     },
    45.  
    46.     d:{
    47.         variables:{},
    48.         functions:{},
    49.         scope: {
    50.            myname:d,
    51.            scope: this.b
    52.         }
    53.     }
    54. };

    凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

    分享到: 更多

    Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

    地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

    电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

    《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号