快速业务通道

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

作者 佚名技术 来源 网页制作 浏览 发布时间 2012-03-06

上面就是关于语法分析树的一个简单表示,正如我们前面分析的,语法分析树主要记录了每个 function 中的变量集(variables),方法集(functions)和作用域(scope)
语法分析树关键点

  • 1变量集(variables)中,只有变量定义,没有变量值,这时候的变量值全部为“undefined”
  • 2作用域(scope),根据词法作用域的特点,这个时候每个变量的作用域就已经明确了,而不会随执行时的环境而改变。【什么意思呢?就是我们经常将一个方法 return 回去,然后在另外一个方法中去执行,执行时,方法中变量的作用域是按照方法定义时的作用域走。其实这里想表达的意思就是不管你在多么复杂,多么远的地方执行该方法,最终判断方法中变量能否被访问还是得回到方法定义时的地方查证】
  • 3作用域(scope)建立规则
  • a对于函数声明和匿名函数表达式来说,[scope]就是它创建时的作用域
  • b对于有名字的函数表达式,[scope]顶端是一个新的JS对象(也就是继承了Object.prototype),这个对象有两个属性,第一个是自身的名称,第二个是定义的作用域,第一个函数名称是为了确保函数内部的代码可以无误地访问自己的函数名进行递归。

3、执行环境与活动对象
语法分析完成,开始执行代码。我们调用每一个方法的时候,JS 引擎都会自动为其建立一个执行环境和一个活动对象,它们和方法实例的生命周期保持一致,为方法执行提供必要的执行支持,针对上面的几个方法,我们这里统一为其建立了活动对象(按道理是在执行方法的时候才会生成活动对象,为了便于演示,这里一下子定义了所有方法的活动对象),具体如下:
执行环境

  1. /**
  2. * 执行环境:函数执行时创建的执行环境
  3. */
  4. var ExecutionContext = {
  5.     window: {
  6.         type: ''global'',
  7.         name: ''global'',
  8.         body: ActiveObject.window
  9.     },
  10.  
  11.     a:{
  12.         type: ''function'',
  13.         name: ''a'',
  14.         body: ActiveObject.a,
  15.         scopeChain: this.window.body
  16.     },
  17.  
  18.     b:{
  19.         type: ''function'',
  20.         name: ''b'',
  21.         body: ActiveObject.b,
  22.         scopeChain: this.a.body
  23.     },
  24.  
  25.     c:{
  26.         type: ''function'',
  27.         name: ''c'',
  28.         body: ActiveObject.c,
  29.         scopeChain: this.b.body
  30.     },
  31.  
  32.     d:{
  33.         type: ''function'',
  34.         name: ''d'',
  35.         body: ActiveObject.d,
  36.         scopeChain: this.b.body
  37.     }
  38. }

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号