Javascript Closures (2)(2)
作者:Dreamer 来源:Dreamer’s Blog 发布时间:2009-03-18 12:22:00
scope 链 和 [[scope]] 属性
要了解 scope 链,首先需要了解的就是内部的 [[scope]] 属性。在ECMAScript 中,所有的函数都是对象,在执行函数声明或者表达式的时候会创建函数对象,它们也可以通过构造函数 Function 被创建。
在通过构造函数Function 来创建函数对象的时候,这个函数对象内部的 [[scope]] 属性总是指向一个只包含了global对象的scope链。通过声明或者表达式创建的函数对象内部的[[scope]]属性则指向其所在的执行环境的scope 链。
比如下面两段代码:
function exampleFunction(formalParameter)
{ ... // function body code
}
var exampleFuncRef = function(){
... // function body code
}
虽然写法有点不同,函数对象创建的时间也不同,但是由于它们所处的都是全局的执行环境,所以它们内部的[[scope]] 属性指向的scope 链只包含一个 global 对象。
内部函数有一些不同,因为它们是在函数内部定义的,所以执行环境就不是全局执行环境,scope链上的对象就比较多。看一下下面的代码:
function exampleOuterFunction(formalParameter){
function exampleInnerFuncitonDec(){
... // inner function body
}
... // the rest of the outer function body.
}
exampleOuterFunction( 5 );
对于内部函数exampleInnerFuncitonDec()来说,当外部函数被调用的时候,就创建了一个新的执行环境和相应的Activation/Variable 对象,所以它内部的[[scope]]属性就指向了当前的scope链:包含了当前执行环境的Activation 对象以及外部函数的 [[scope]] 上的global对象。
由此我们看到,代码的逻辑和结构会自动控制 scope 链的创建。不过ECMAScript提供了一个 with 语句,使用它可以更改scope 链。
函数声明不会受到 with 语句的影响,因为它们在变量初始化的时候就已经创建相应的函数对象了,但是函数表达式可以,看下面的代码:
var y = {x:5};
function exampleFuncWith(){
var z;
with(y){
z = function(){
... // inner function expression body;
}
}
...
}
由于使用了 with 语句,在函数执行的时候,内部函数 z 的 [[scope]] 属性指向的 scope 链的前面又会插入一个 y 对象,变成: y对象->当前执行环境的Activation对象->global对象。
接下来看一下标识符定位的问题。当代码运行的时候如果发现了某个标识符,就会在scope链中的对象上寻找与它对应的变量,从第一个开始依次找,如果找到就返回,不然就一直找到 scope 链的末尾。由于函数被调用的时候会创建新的执行环境,就会把相应的Activation/Variable 对象插入到 scope 链的前面,所以对于函数体中的标识符,总是会先检查是否有相对应的内部函数、参数或者本地变量。
猜你喜欢
- 项目说明开发php项目管理系统,由于是新项目且已经部署在生产环境,导致需要根据实际使用情况,进行及时的功能升级或bug修复。每次升级,进行程
- 当浏览网页时,总有那么一类网站华丽而富有趣味性。在浏览信息的同时,足够让我们眼前一亮。它们在充分融入动画、视频、游戏、甚至是与众不同的交互操
- 可以自动轮换的页签 tabs with auto play fucntion<html><head><meta
- 在SQL SERVER中,你可能需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。你们大部分人大概
- 在用户登录windows操作系统的时候,如果触发到了登录表单的密码录入框上,并且此时按下了“大写锁定键(Caps Lock)”,那么界面上会
- 本文详细解说了MySQL Order By Rand()效率优化的方案,并给出了优化的思路过程,是篇不可多得的MySQL Order By
- 可以使用 Application 对象在给定的应用程序的所有用户之间共享信息。基于 ASP 的应用程序同所有的 .asp 文件一样在一个虚拟
- 虽然我只是把豆瓣当作一个纪录工具来用,纪录下自己看过的电影、听过的音乐、读过的书籍,我几乎不关注豆瓣上的任何影评、乐评、音衣服之类的内容,但
- 声明,本文中所称CSS雪碧即为CSS Sprites,这个词组一直没有一个固定或者约定俗成的中文翻译,一些人开始称之为CSS雪碧,我们且当作
- 常用字段类型bit(0和1),datetime,int,varchar,nvarchar(可能含有中文用nvarchar) Varchar,
- 例如:将日期格式为2009-6-8的转换为2009-06-08,给小于10的数字补上一个0方法一:year(now)
- 以下的文章主要介绍的是SQL Serve数据库到DB2连接服务器的实现过程,我们大家都知道不同数据库平台的互连,一般对其称之为数据库的异构服
- 1、目前来看,百付宝仅仅只是C2C的一个支付后台。他的内容只集中于“钱和订单”两个环节,没有其他干扰信息。2、百付宝的界面表现很简单。因为简
- 前段时间我们部门的粉丝和布林同学都写过关于这个问题的文章。刚好阅读了关于这个问题的其他争论文章。所以顺便在这补充几点。首先说明这里讨论的是在
- 问题:导入数据时是否需要禁用索引?解答:在使用load data导入数据时,如果导入的表是MyISAM的,对于空表,MySQL数据库会把所有
- 一.gb2312,gbk,utf8等支持多字节编码的字符集都可以储存汉字,gb2312中的汉字数量远少于gbk,而gb2312,gbk等都可
- 前段时间嗷嗷有发过"好玩的放大镜效果",今天看了下,发现还有简单的方法也能够实现,即利用内外补丁的调整。有兴趣的可以在琢
- 分享一个 * 真网页拾色器(调色板),颜色丰富216色,使用方便。运行截图:<html id="container"
- 希腊Web 设计师Christos Chiotis 发表在 CssGlobe 的一篇文章,讲述了黄金分割率在 CSS 中的应用。黄金分割率是
- IE下专属CSS:<![if !IE]><link rel="stylesheet" type=&qu