ECMA-262-5 词法环境:ECMA实现(一)--- 简介
本文翻译自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.