程序员人生 网站导航

ECMA-262-3 深入解析.第二章.变量对象

栏目:jscript时间:2013-12-14 06:14:58

导言

在程序中我们总要声明变量和函数,然后成功的用它们来构建我们的系统。当我们引用需要的对象时,解释器如何、在哪里找到我们的数据(functions,variable),会发生什么?

很多ECMAScript 程序员都清楚变量与执行上下文密切相关。

var a = 10; // variable of the global context(function () {  var b = 20; // local variable of the function context})();alert(a); // 10alert(b); // "b" is not defined

同时,很多程序员也知道,在当前版本的规范中,独立的作用域只能通过“function”代码类型的执行上下文来创建。也就是说,对比C/C++,ECMAScript 中的循环块不能创建一个局部的上下文。

for (var k in {a: 1, b: 2}) {  alert(k);}alert(k); // variable "k" still in scope even the loop is finished

当声明数据时会发生什么?让我们看看更多细节。

数据声明

当变量与执行上下文相关,它应该知道数据存储在哪里,如何得到它。这种机制称之为变量对象。

变量对象(缩写为VO)是与执行上下文相关的对象,它存储:

 

  • 变量(var VariableDeclaration);
  • 函数声明(FunctionDeclaration 缩写为FD);
  • 以及函数的形参。

在上下文中声明

例如,它可以表现为正常的ECMAScript对象的变量对象:

VO = {};

正如我们所说,VO是执行上下文的属性:

activeExecutionContext = {  VO: {    // context data (var, FD, function arguments)  }};

间接引用变量(通过VO的属性名)只限于全局上下文的变量对象(在那里全局对象自身就是变量对象,稍后将涉及到)。对于其它作用域,直接引用一个VO是不可能的,它完全是执行机制。

当我们声明一个变量或一个函数时,并没有为VO创建一个新的属性,该属性拥有我们变量的名字和值。

例如:

var a = 10;function test(x) {  var b = 20;};test(30);

相应的变量对象是:

// Variable object of the global contextVO(globalContext) = {  a: 10,  test:<reference to function>};// Variable object of the "test" function contextVO(test functionContext) = {  x: 30,  b: 20};

但是,在执行期间(和规范中),变量对象是一个抽象的实体。从根本来讲,在具体的执行上下文中,VO命名不同,并且有不同的初始结构。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐