可执行代码
ECMAScript 5th规定了3种可执行代码:Global code、Eval code和Function code。
根据名字就已经知道,Global code
和Eval code
分别对应全局代码和eval
函数中执行的代码。
三种可执行代码中最为复杂的就是Function code
,即函数代码。因为javascript的特性,所以Function code
中还可以嵌入Function code
,导致了Function
的执行环境会较为复杂。
执行环境(执行上下文)
当javascript引擎开始执行(进入)一段可执行代码时,就会生成一个执行环境(Execution Context
,或称执行上下文)。
javascript引擎通过一个栈(Stack
)来维护执行环境,当进入一个执行环境,则将当前运行的执行环境压入到这个栈的顶部,代码表示:
var ECStack = [];//维护执行环境的栈
function enterExecutabCode(){
var ec = new ExecutionContext();
ECStack.push(ec);
}
一个执行环境是由:LexicalEnvironment
、VariableEvironment
和ThisBinding
组成的。
function ExecutionContext(){
return {
LexicalEnvironment,
VariableEnvironment,
ThisBinding
}
}
词法环境(Lexical Environments)注意是复数哦~
一个词法环境对象包括:环境数据(Environment Record
)和外部环境(outer Lexical Environment
)。
外部环境(outer Lexical Environment)
表示外层函数的词法环境,有两种:null
(global
环境),或者外层函数的词法环境(嵌套函数)
环境数据(记录)(Environment Record)
有两种环境数据:declarative environment records
和 object environment records
,因为存在两种类型的环境数据,所以词法环境的实现类型包括了两种:DecarativeEnvironment
和ObjectEnvironment
。
Declarative environment records
常见标识符绑定基本都是这个类型,例如函数定义,var
声明,try
的catch
子句
Object environment records
包括两种一种是程序级别的(Program
),另外一种是with语句,因为这两种绑定标识符过程需要传入一个对象做为环境数据的属性值。
继续说环境数据,环境数据存在于词法环境或者变量环境中,它包含了一个绑定对象(bindingObject
),这个对象是一种键值对象,即有name
和value一一对应关系,其中name
就是标识符,value
则为对应的变量值。
既然环境数据是保存数据的地方,必然有一些方法用于存储数据和读取数据。所以环境数据常见的方法有: