JavaScript ecma - 262 - 3中变量对象的用法

  介绍

这篇文章主要讲解了JavaScript ecma - 262 - 3中变量对象的用法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。


我们在创建应用程序的时候,总免不了要声明变量和函数。那么,当我们需要使用这些东西的时候,解释器(翻译)是怎么样,从哪里找到我们的数据(函数,变量)的,这个过程究竟发生了什么呢?

大部分ECMAScript程序员应该都知道变量与执行上下文密切相关:

 var=10;//变量全局上下文
  
  (函数(){
  var b=20;//局部变量函数的上下文
  })();
  
  alert ();//10
  警报(b);//癰"以前没有定义 

同样,很多程序员也知道,基于当前版本的规范,独立作用域只能通过“函数(函数)“代码类型的执行上下文创建。那么,想对于C/c++举例来说,ECMAScript里, 循环并不能创建一个局部的上下文。(译者注:就是局部作用域):

 

下面我们具体来看一看,当我们声明数据时候的内部细节。

数据声明

如果变量与执行上下文相关,那么它自己应该知道它的数据存储在哪里和如何访问。这种机制被称作变量对象(变量对象)

变量对象(缩写为签证官)就是与执行上下文相关的对象(译者注:这个对“象”的意思就是指某个东西),它存储下列内容:

    <李>变量(var, VariableDeclaration); <李>函数声明(FunctionDeclaration,缩写为FD); <李>以及函数的形参李

以上均在上下文中声明。

简单举例如下,一个变量对象完全有可能用正常的ECMAScript对象的形式来表现:

 VO={}; 

正如我们之前所说,签证官就是执行上下文的属性(财产):

activeExecutionContext={   签证官:{//上下文数据(var, FD,函数参数)   }   };

只有全局上下文的变量对象允许通过签证官的属性名称间接访问(因为在全局上下文里,全局对象自身就是变量对象,稍后会详细介绍)。在其它上下文中是不可能直接访问到签证官的,因为变量对象完全是实现机制内部的事情。

当我们声明一个变量或一个函数的时候,同时还用变量的名称和值,在签证官里创建了一个新的属性。

例如:

 var=10;
  
  功能测试(x) {
  var b=20;
  };
  
  测试(30);

对应的变量对象是:

//变量全局上下文对象
  签证官(中)={
  答:10
  测试:
  };//变量的对象“test"函数的上下文
  签证官(测试functionContext)={
  x: 30,
  b: 20
  };

在具体实现层面(和在规范中)变量对象只是一个抽象的事物。(译者注:这句话翻译的总感觉不太顺溜,欢迎您提供更好的译文)从本质上说,在不同的具体执行上下文中,签证官的名称和初始结构都不同。

不同执行上下文中的变量对象

对于所有类型的执行上下文来说,变量对象的一些操作(如变量初始化)和行为都是共通的。从这个角度来看,把变量对象作为抽象的基本事物来理解更容易。而在函数上下文里同样可以通过变量对象定义一些相关的额外细节。

 JavaScript ecma - 262 - 3中变量对象的用法

下面,我们详细展开探讨,

全局上下文中的变量对象

这里有必要先给全局对象(全局对象)一个明确的定义:

全局对象(全局对象)是在进入任何执行上下文之前就已经创建的对象,这个对象只存在一份,它的属性在程序中任何地方都可以访问,全局对象的生命周期终止于程序退出那一刻。

初始创建阶段,全局对象通过数学、字符串、日期、方法等属性初始化,同样也可以附加其它对象作为属性,其中包括可以引用全局对象自身的对象,例如,在DOM中,全局对象的窗口属性就是引用全局对象自身的属性(当然,并不是所有的具体实现都是这样):

JavaScript ecma - 262 - 3中变量对象的用法