阅读(3259) (0)

建立执行环境

2017-06-16 15:16:36 更新

解释执行 全局代码 或使用 eval 函数(15.1.2.1)输入的代码会创建并进入一个新的执行环境。每次调用 ECMA 脚本代码定义的函数(13.2.1)也会建立并进入一个新的执行环境,即便函数是自身递归调用的。每一次 return 都会退出一个执行环境。抛出异常也可退出一个或多个执行环境。

 当控制流进入一个执行环境时,会设置该执行环境的 this 绑定,定义变量环境和初始词法环境,并执行定义绑定初始化过程(10.5)。以上这些步骤的严格执行方式由进入的代码的类型决定。

进入全局代码

 当控制流进入 全局代码 的执行环境时,执行以下步骤:

  1. 按 10.4.1.1 描述的方案,使用 全局代码 初始化执行环境。
  2. 按 10.5 描述的方案,使用 全局代码 执行定义绑定初始化步骤。

10.4.1.1 初始化全局执行环境

 以下步骤描述 ECMA 脚本的全局执行环境 C 的创建过程:

  1. 将变量环境设置为 全局环境 。
  2. 将词法环境设置为 全局环境 。
  3. 将 this 绑定设置为 全局对象 。

进入 eval 代码

 当控制流进入 eval 代码 的执行环境时,执行以下步骤:

  1. 如果没有调用环境,或者 eval 代码 并非通过直接调用(15.1.2.1.1)eval 函数进行评估的,则按(10.4.1.1)描述的初始化全局执行环境的方案,以 eval 代码 作为 C 来初始化执行环境。
  2. 否则将 this 绑定设置为当前执行环境下的 this 绑定。将词法环境设置为当前执行环境下的 词法环境 。将变量环境设置为当前执行环境下的变量环境。
  3. 如果 eval 代码 是 严格模式下的代码 ,则令 strictVarEnv 为以词法环境为参数调用 NewDeclarativeEnvironment 得到的结果。设置词法环境为 strictVarEnv。设置变量环境为 strictVarEnv。
  4. 按 10.5 描述的方案,使用 eval 代码 执行定义绑定初始化步骤。

严格模式下的限制

 如果调用环境的代码或 eval 代码 是 严格模式下的代码 ,则 eval 代码不能在调用环境的变量环境中 初始化变量及函数绑定 。与之相对的,变量及函数绑定将在一个新的环境变量中被初始化,该环境变量仅可被 eval 代码 访问。

进入函数代码

 当控制流根据一个函数对象 F、调用者提供的 thisArg 以及调用者提供的 argumentList,进入 函数代码 的执行环境时,执行以下步骤:

  1. 如果 函数代码 是 严格模式下的代码 ,设 this 绑定为 thisArg。
  2. 否则如果 thisArg 是 null 或 undefined,则设 this 绑定为 全局对象 。
  3. 否则如果 Type(thisArg) 的结果不为 Object,则设 this 绑定为 ToObject(thisArg)。
  4. 否则设 this 绑定为 thisArg。
  5. 以 F 的 [[Scope]] 内部属性为参数调用 NewDeclarativeEnvironment,并令 localEnv 为调用的结果。
  6. 设词法环境为 localEnv。
  7. 设变量环境为 localEnv。
  8. 令 code 为 F 的 [[Code]] 内部属性的值。
  9. 按 [10.5](#10.5) 描述的方案,使用 函数代码 code 和 argumentList 执行定义绑定初始化步骤。