- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(12 )变量对象 (Variable Object )
介绍
JavaScript编程的时候总避免不了声明函数和变量,以成功构建我们的系统,但是解释
是如何并且在什么地⽅去查找这些函数和变量呢?我们引⽤这些对象的时候究竟发
⽣了什么?
原始发布:Dmitry A . Soshnikov
发布时间:2009-06-27
俄⽂地址:http://dmitrysoshnikov .com/ecmascript/ru-chapter-2-varia le-
o ject/
英⽂翻译:Dmitry A . Soshnikov
发布时间:20 10-03-15
英⽂地址:http://dmitrysoshnikov .com/ecmascript/chapter-2-varia le-o ject/
部分难以翻译的句⼦参考了justinw的中⽂翻译
⼤多数ECMAScript程序员应该都知道变量与执⾏上下⽂有密切关系:
var a = 10; // 全局上下⽂中的变量
(function () {
var b = 20; // function上下⽂中的局部变量
})();
alert(a); // 10
alert(b); // 全局变量 b 没有声明
并且,很多程序员也都知道,当前ECMAScript规范指出独⽴作⽤域只能通过“函数
(function)”代码类型的执⾏上下⽂创建。也就是说,相对于C/C++来说,ECMAScript
⾥的for循环并不能创建⼀个局部的上下⽂。
for (var k in {a: 1, b: 2}) {
alert(k);
}
alert(k); // 尽管循环已经结束但变量k依然在当前作⽤域
我们来看看⼀下,我们声明数据的时候到底都发现了什么细节。
数据声明
如果变量与执⾏上下⽂相关,那变量⾃⼰应该知道它的数据存储在哪⾥,并且知道如
何访问。这种机制称为变量对象(varia le o ject) 。
变量对象(缩写为VO)是⼀个与执⾏上下⽂相关的特殊对象,它存储着在上下⽂中声明
的以下内容:
变量 (var, 变量声明);
数声明 (FunctionDeclaration, 缩写为FD);
数的形参
举例来说,我们可以⽤普通的ECMAScript对象来表⽰⼀个变量对象:
V = {};
就像我们所说的, VO就是执⾏上下⽂的属性(property) :
activeExecutionContext = {
V : {
// 上下⽂数据 (var, FD, function arguments)
}
};
只有全局上下⽂的变量对象允许通过VO的属性名称来间接访问( 因为在全局上下⽂
⾥,全局对象⾃⾝就是变量对象,稍后会详细介绍) ,在其它上下⽂中是不能直接访问
VO对象的,因为它只是内部机制的⼀个实现。
当我们声明⼀个变量或⼀个函数的时候,和我们创建VO新属性的时候⼀样没有别的
区别 (即:有名称以及对应的值)。
例如:
var a = 10;
function test(x) {
var b = 20;
};
test(30);
对应的变量对象是:
// 全局上下⽂的变量对象
V (globalContext) = {
a: 10,
test: function
};
// test 数上下⽂的变量对象
V (test functionContext) = {
x : 30,
b: 20
};
在具体实现层⾯( 以及规范中)变量对象只是⼀个抽象概念。(从本质上说,在具体执⾏
上下⽂中,VO名称是不⼀样的,并且初始结构也不⼀样。
不同执⾏上下⽂中的变量对象
对于所有类型的执⾏上下⽂来说,变量对象的⼀些操作(如变量初始化)和⾏为都是共
通的。从这个⾓度来看,把变量对象作为抽象的基本事物来理解更为容易。同样在函
数上下⽂中也定义和变量对象相关的额外内容。
抽象变量对象V (变量初始化过程的⼀般⾏为)
║
╠══ 全局上下⽂变量对象GlobalContextV
║ (V === this === global)
║
╚══ 数上下⽂变量对象FunctionContextV
(V === A , 并且添加了arguments和formal param
文档评论(0)