10 可执行代码与可执行环境
10.1 可执行代码类型:全局代码(作为ECMA脚本被解析的源代码),eval(在特定的一次对eval的调用过程中,eval代码作为改程序的#global-code部分),函数代码(作为函数体被解析的源代码,不包括嵌套函数的函数体被解析的源代码)
10.1.1 严格模式下的代码
以指令序言开始,包含一个使用严格模式的指令序言
在严格模式下的代码中通过直接调用eval函数时即为严格eval代码
函数声明,函数表达式或函数赋值访问器处在严格模式下的代码中,或者函数代码以包含严格模式的指令序言开始
调用内置function构造器时最后一个参数字符串作为函数体处理时以包含严格模式指令序言的指令序言开始
10.2 词法环境
一个用于定义特定变量和函数标识符在 ECMAScript 代码的词法嵌套结构上关联关系的规范类型
一个词法环境由一个环境记录项和可能为空的外部外部词法环境构成。
10.2.1 环境记录项
声明式环境记录项 和 对象式环境记录项
可以理解为面向对象中的一种简单继承结构
环境记录项的抽象方法:HasBinding(n);
CreateMutableBinding(N, D)(D为true时绑定可删除);
SetMutableBinding(N绑定的名称,V绑定的值, S是否为严格模式);
GetBindingValue(N,S);
DeleteBinding(N);
ImplicitThisValue()当从该环境记录项的绑定中获取一个函数对象并且调用时,该方法返回该函数对象使用的 this 对象的值
10.2.1.1 声明式环境记录项
每个声明式环境记录项都与一个包含变量和(或)函数声明的 ECMA 脚本的程序作用域相关联。
CreateImmutableBinding(N)
InitializeImmutableBinding(N,V)
10.2.1.2 对象式环境及录像
无论是对象自身的,还是继承的属性都会作为绑定,无论该属性的 [[Enumerable]] 特性的值是什么
即使该绑定对应的属性的 Writable 特性的值为 false。对象式环境记录项没有不可变绑定
10.2.2 词法环境的计算
GetIdentifierReference (lex词法环境, name标识符字符串, strict严格模式标识(严格模式时为"strict"))
NewDeclarativeEnvironment(E词法环境)
NewObjectEnvironment(O对象,E词法环境,可为null)
10.2.3 全局环境
唯一的词法环境,在任何ECMA脚本执行之前创建
全局环境的外部环境引用为null
10.3 执行环境
当前活动的多个执行环境在逻辑上形成一个栈结构。栈最顶层为当前运行的执行环境
每个执行环境包含:词法环境,变量环境,>this绑定;其中词法环境和变量环境组件始终为词法环境对象。
执行环境是一个纯粹的标准机制,并不代表任何ECMA脚本实现的工件。在ECMA脚本程序中不可能访问到执行环境。
10.3.1 标识符解析
使用正在运行的执行环境中的词法环境,通过一个标识符获得其对应的绑定的过程。
解释执行一个标识符的到的结果必定是引用类型的对象,且其引用名属性的值与identifier字符串相等。
10.4 建立执行环境
每次解释执行全局代码或使用eval函数输入的代码或者调用脚本代码定义的函数 甚至是自身递归调用都会创建并进入一个新的执行环境。每一次return都会退出一个执行环境,就连抛出异常也会退出一个或多个执行环境。
控制流进入一个执行环境时会设置该执行环境的this绑定。
10.4.1.1 初始化全局执行环境:变量环境,词法环境=>为全局环境 this->全局对象
10.5 定义绑定初始化
http://yanhaijing.com/es5/#151
10.6 Arguments对象(http://yanhaijing.com/es5/#152)
Arguments 对象通过调用抽象方法 CreateArgumentsObject 创建,调用时将以下参数传入:func, names, args, env, strict。
没彻底搞懂内部实现机制,待整个啃完第一遍之后再回来重新研究==