优内建站网,专业建站,企业建站,免费建站,智能建站,个人建站!
主营企业建站,seo优化,手机网站,微信网站开发等业务!>> 繁体中文
用户名: 密 码: 验证码:    
企业建站,专业建站,模板建站,智能建站
 您现在的位置:首页 >> Javascript教程 >> 详细内容>>        【字体:  】【颜色: 绿

JavaScript中的[[scope]]和Scope Chain

在百度搜索关于“JavaScript中的[[scope]]和Scope Chain”的内容

在谷歌搜索关于“JavaScript中的[[scope]]和Scope Chain”的内容

买空间、服务器就上威客主机网(VK163.COM) 虚拟主机评测+IDC导航=威客主机之家 标志设计
[内容提要] ECMA262中规定JS使用ScopeChain来实现closure,ScopeChain是JS中非常重要的机制,JS中所有的标识符(Identifier)都是通过ScopeChain来查找值的。下面的部分是关于ECMA262及其实现SpiderMonkey和JScrip...

作者: 优内科技  来源: 优内科技  驻站日期:2008/12/30 【 加入收藏 】 【 打印此页 】 【 关闭

ECMA262中规定JS使用Scope Chain来实现closure,Scope Chain是JS中非常重要的机制,JS中所有的标识符(Identifier)都是通过Scope Chain来查找值的。下面的部分是关于ECMA262及其实现SpiderMonkey和JScript如何用Scope Chain和[[scope]]来实现closure的。

  变量标识符查找

  当我们在JS程序里写下像a++这样的表达式时,很难想象a的值和内存地址经过了复杂的查找过程才得以确定,JS的所有标识符(通常是我们自己定义的变量名)在执行时都是从Scope Chain中查找值的,这也是导致JS执行速度低的原因和JS实现灵活的动态特性的基础。Scope Chain是一个链表,在JS执行时,总是维护着Scope Chain来保证变量的可访问性或者不可访问性。对于这个过程ECMA262给出了很明确的描述(我翻译了一下,各位将就着看):

  1. 获取Scope Chain的下一个对象。如果没有对象了,则转到第5步。

  2. 调用结果(1)的[[HasProperty]]方法, 传递Identifier作为参数

  3. 如果结果(2)是true, Reference(引用)类型的值,它的base object是结果(1)而它的

  property name是Identifier

  4. 跳到第1步

  5. 返回一个Reference类型,它的base object是null它的property name 是Identifier.

  注:Reference(引用)类型的值是JS引擎使用的一种数据类型,它分为base object和property name两个部分。假设在JS代码中有obj.prop这样的表达式,那么解释成Reference类型,base object是对象obj,而property name是字符串”prop”

  Scope Chain开始时被设为宿主对象,所以在全局代码中的变量就是宿主对象的属性。Scope Chain在执行时由JS引擎自动维护,编译型的引擎也会创建相应的运行时环境来做此事。Scope Chain一般在函数调用或者执行进入with块的时候改变。

  函数的执行

  JS函数执行并非简单地执行函数体(Function Body)中的JS代码,在此之前JS引擎会创建一个Activation Object,这个对象将会被作为Scope Chain的顶端,而函数的[[scope]]属性中的对象将被链接为其后续的对象。([[scope]]在函数定义时被确定,稍后的内容是关于[[scope]]如何定义的。)这意味着Function Body中的JS代码所使用的标识符都是按照上一部分所描述的,最先从Activation Object开始查找的。Activation Object创建时只有一个arguments属性,它不会继承Object.prototype的属性和方法。接下来的变量初始化(Variable Instantiation)将函数体中变量和函数声明的结果添加到Activation Object作为属性。

  函数的[[scope]]属性

  [[scope]]是ECMA262规定的对象的私有属性,理论上只有JS引擎可以访问,但FireFox的几个引擎(SpiderMonkey和Rhino)提供了私有属性__parent__来访问它(所以一会我们可以看一看它)。尽管所有对象都有[[Scope]]但是它只对函数对象有用。

  对于函数声明和匿名函数表达式来说,[[scope]]就是它创建时的Scope Chain,但是对于有名字的函数表达式,[[scope]]顶端是一个新的JS对象(也就是继承了Object.prototype),这个对象被链到函数创建时的Scope Chain,它本身有一个属性就是函数的名字,这确保了函数内部的代码可以无误地访问自己的函数名进行递归。

  举个例子

functionf1()
{
  returnn>1?n*f1(n-1):1;
}
varf2=functionf()
{
  returnn>1?n*f(n-1):1;
}

  f1的递归是不安全的,而f2的递归是安全的。但是注意这仅仅是针对标准的规定而言,事实上IE并没有实现这个性质

添加到QQ书签 百度收藏 订阅到抓虾 添加到鲜果  新浪ViVi  365Key网摘  天极网摘  我摘  和讯网摘  yahoo  收藏到收客网  Digbuzz我挖网  添加到饭否  挖客  添加到google  

   【回到顶部】 【返回文章列表】 编辑:优内科技
⊕ 上一篇:浅谈JavaScript框架设计
⊕ 下一篇:Javascript实例:Select的OnChange()事件
  相关新闻
返回首页 | 设为首页 | 添加收藏 | 关于我们 | 联系我们 | 企业文化 | 合作伙伴 | 诚聘英才 | 网站报价 | 企业资质 | 网站地图
邮箱登陆 E- mail:master@cck5.com 点击这里给我发消息 客服专员 QQ:310203268 点击这里给我发消息 技术咨询 QQ:22071287点击这里给我发消息 代理备案 QQ:529631515
丰富的网站建设经验,专业提供网站建设、网站制作、网页设计服务,专业设计,真诚服务,不满意不收费!
Copyright 2008 - 2025 cck5 Inc. All Rights Reserved 优内建站网络科技公司
本站部分资源来自网络,如有侵犯您的版权,请告之,我们将即刻删除!QQ:310203268
主要业务:网站建设企业建站专业建站智能建站SEO优化微信建站手机建站
本站ICP备案号:浙ICP备11019299号 中国电信增值ICP经营许可证
不良信息举报中心 江西网警 信息产业部门备案 企业法人营业执照
 
扫优内微信二维码
“码”上有惊喜