ECMA-262-5 词法环境:ECMA实现(一)--- 简介

翻译 2017年12月05日 23:10:00

本文翻译自Dmitry Soshnikov的关于ECMAScript 系列的文章。其中涉及理论较多,如果想要更好的明白里面所讲的,要对ECMAScript 中相关概念本身有一点的基础,对于之前从未了解过得,推荐先到Dmitry Soshnikov文章中看完ES3系列的介绍,里面也有中文版本。此外,由于理论较多,难免会存在语言的上的生涩或者纰漏以及不规范之处,希望指正。这个系列分成了八个小篇章,可能需要读完才能更好的理解里面讲述的东西,同时,也可以可以结合ECMA-262-5规范来看本文。最后,这是本人独自翻译,并且获得原作者Dmitry Soshnikov的认可,如果转载注明出处。

介绍

  这一章我们将继续词法环境的介绍。上一章的内容中介绍了一些相关的通用理论,以及环境与词法作用域和闭包这些概念之间的紧密联系。
  上面一部分我们提到过,ECMAScript 使用链式环境帧模型,也就是ES3中的作用域链。在这一部分将介绍词法环境在ECMAScript 中的实现。特别的,本章提到的结构和技术实现的概念,也会与上一部分讲的通用理论象印证。
  先从定义开始,虽然上一部分已经介绍了关于词法环境的通用理论,但这一部分会与ECMA-262-5规范结合,了解具体实现。

定义

 在通用理论中提到过,环境是用来管理逻辑形式上嵌套代码块中的数据,这与ECMAScript 所实现也是一致的。
从定义看:

词法环境定义了在ECMAScript 嵌套词法结构上标识符与变量值和函数的关联关系。

同样,我们提到过命名和值的关系叫做绑定。

  ES(ECMAScript,下同)中的词法环境由两部分组成:一个环境记录项和一个对外部环境的引用。词法环境的定义相当于上面环境模型中的提到的环境帧。

一个环境记录项记录了在关联词法作用域内创建的标识符绑定情形。

  换句话说,一个环境记录项储存了在当前上下文中变量声明,函数声明以及形参。
  看下面这个例子:

var x = 10;
function foo() {
  var y = 20;
}

  现在我们有了两个环境,分别是全局上下文和foo函数创建的上下文。看逻辑表示:

// environment of the global context

globalEnvironment = {

  environmentRecord: {
    // built-ins:
    Object: function,
    Array: function,
    // etc ...

    // our bindings:
    x: 10
  }, 

  outer: null // no parent environment 
};

// environment of the "foo" function

fooEnvironment = {
  environmentRecord: {
    y: 20
  },
  outer: globalEnvironment
};

  对外部环境的引用将当前环境和父级环境链接在一起,而父环境的同样会拥有对它自身外部环境的引用。在这里全局环境的外部引用被设置为null。
  全局环境是所有作用域链的终点。这种形式与ES中的原型继承有些相似:如果在对象上不存在某个属性,那就去它的原型上找,找不到再去原型的原型,这样找下去直到找到,或者直到原型链的最末端。再回到环境:这里的变量(标识符)可以类比对象的属性,对外部环境的引用与对象的原型相似。
  一个词法环境可以包含多个内部词法环境。例如,如果一个函数包含两个嵌套函数,那每个嵌套函数的词法环境中指向外部环境的引用都是它们的外层函数。看下面例子:

function foo() {

  var x = 10;

  function bar() {
    var y = 20;
    console.log(x + y); // 30
  }

  function baz() {
    var z = 30;
    console.log(x + y); // 40
  }

}

// ----- Environments -----

// "foo" environmnet

fooEnvironment = {
  environmentRecord: {x: 10},
  outer: globalEnvironment
};

// both "bar" and "baz" have the same outer
// environment -- the environment of "foo"

barEnvironment = {
  environmentRecord: {y: 20},
  outer: fooEnvironment
};

bazEnvironment = {
  environmentRecord: {z: 30},
  outer: fooEnvironment
};

ECMAScript 定义了两种环境记录项,对应两种不同的实现目标,下面将介绍它们:
ECMA-262-5 词法环境:ECMA实现(二)— 环境记录项

原文链接

ECMA-262-5 in detail. Chapter 3.2. Lexical environments: ECMAScript implementation.

ECMA-262-5 词法环境:ECMA实现(二)--- 环境记录项

环境记录类型  ES5中有两种类型的环境记录项,分别是声明式环境记录项和对象式环境记录项。声明式环境记录项  声明式环境记录项是用来处理变量声明,函数声明以及形参与值的绑定,这些都出现在函数作用域中(...
  • szengtal
  • szengtal
  • 2017年12月05日 23:15
  • 65

ECMA-262-5 词法环境:ECMA实现(三)--- 执行上下文

执行上下文的结构  这部分主要讨论在ES5中执行上文(同执行环境)的结构,它与ES3中的有一些不同,先看看它的组成组件:ExecutionContextES5 = { ThisBinding: ,...
  • szengtal
  • szengtal
  • 2017年12月05日 23:22
  • 104

ECMA-262-5 词法环境:ECMA实现(四)--- 标识符解析及其他

标识符解析标识符解析是指在执行阶段决定一个出现在上下文中,使用词法环境的标识符的绑定关系的过程。   换句话说,这一个作用域链查找过程。在上面说过,这类似于原型链的查找,而在这里是通过词法环境的out...
  • szengtal
  • szengtal
  • 2017年12月05日 23:24
  • 56

ECMA-262-5 词法环境:通用理论(四)--- 环境

这一章我们将介绍词法作用域的技术实现。同时,在进一步介绍涉及到的一些高度抽象的实体和讲解词法作用域的时候,本文将开始使用环境的概念而不是作用域。”环境”是在ES5时期被引入规范中,与它一起的还包括全局...
  • szengtal
  • szengtal
  • 2017年12月05日 18:07
  • 22

我对“词法环境”“执行上下文”的理解

execution context,lexical environment左边的这两个单字出自ECMA标准用于规范语言实现,也就是回答“代码是怎样被执行的?”。我没有耐心仔细的研读规范,如果日后我有了...
  • u012934099
  • u012934099
  • 2015年09月23日 16:40
  • 907

ECMA-262-5 词法环境:通用理论(一)--- 作用域

ECMA-262-5 词法环境:通用理论译者按:本文翻译自Dmitry Soshnikov的关于ECMAScript 系列的文章。其中涉及理论较多,如果想要更好的明白里面所讲的,要对ECMAScrip...
  • szengtal
  • szengtal
  • 2017年12月05日 17:03
  • 43

PL/0 词法分析器设计 c语言

【实验内容】 用C余元编写一个PL/0词法分析器,为语法语义分析提供单词,使之能把输入的字符串形式的源程序风格成一个个单词符号传递给语法语义分析,并把分析结果(基本字,运算符,标识符,常熟以及界符)输...
  • Double2hao
  • Double2hao
  • 2016年04月20日 15:46
  • 2976

ECMAScript6新特性简介

原文:http://blog.gejiawen.com/2015/07/28/es6-new-feature/ ES6(ECMAScript 6)终于在2015年6月正式发布了。距离上一次正式公...
  • arjick
  • arjick
  • 2016年06月19日 16:38
  • 2897

自制编译器---c++实现词法分析器

词法单元词法解析器在编译器中的作用,是将输入流解析为一种能够被语法解析器使用和管理的格式。他将输入文本分割,打标签,也就是用一些数值来指代一系列相应的字符串。 例如:int a,b,c; a=34;...
  • taoyanqi8932
  • taoyanqi8932
  • 2016年06月25日 21:45
  • 2037

纯C实现的词法分析和lex实现的词法分析的对比

(一):写在前面在上面的学习当中,我们通过简单的lex例子,进一步扩展lex例子,通过和yacc的融合来进行简单英语语法分析。通过这几个例子,使我们深深的感受到lex和yacc的方便和强大功能。我们最...
  • hongbochen1223
  • hongbochen1223
  • 2016年01月15日 14:03
  • 1471
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ECMA-262-5 词法环境:ECMA实现(一)--- 简介
举报原因:
原因补充:

(最多只允许输入30个字)