1 执行环境
当控制器转入 ECMA 脚本的可执行代码时,控制器会进入一个执行环境。
当前活动的多个执行环境在逻辑上形成一个栈结构。
该逻辑栈的最顶层的执行环境称为当前运行的执行环境。
2 词法环境和环境记录项
一个词法环境由一个环境记录项和可能为空的外部词法环境引用构成。
声明式环境记录项用于定义那些将 标识符 与语言值直接绑定的 ECMA 脚本语法元素,例如 函数定义 , 变量定义 以及 Catch 语句。
对象式环境记录项用于定义那些将 标识符 与具体对象的属性绑定的 ECMA 脚本元素,例如 程序 以及 With 表达式 。
3 建立执行环境
(1)进入全局代码
1.令 env 为当前运行的执行环境的环境变量的 环境记录2.如果 code 是 eval 代码 ,则令 configurableBindings 为 true,否则令 configurableBindings 为 false。3.如果代码是 严格模式下的代码 ,则令 strict 为 true,否则令 strict 为 false5.遍历代码,找到所有的函数声明表达式,创建函数对象,绑定所有的函数名8.遍历代码,对每个变量声明,如果没有绑定,创建并设置绑定值undefined
(2)进入函数代码
1.令 env 为当前运行的执行环境的环境变量的 环境记录2.如果 code 是 eval 代码 ,则令 configurableBindings 为 true,否则令 configurableBindings 为 false。3.如果代码是 严格模式下的代码 ,则令 strict 为 true,否则令 strict 为 false4.函数的参数列表,绑定所有形参名5.遍历代码,找到所有的函数声明表达式,创建函数对象,绑定所有的函数名6.检查arguments是否已绑定(函数声明、形参可能已经绑定arguments)7.如果没有绑定,则创建一个arguments对象,并执行绑定8.遍历代码,对每个变量声明,如果没有绑定,创建并设置绑定值undefined
4 通过上面的理解,我们可以得出:
function a(b, c) {function b() {}console.log(b); =====> 输出 b()
}a(1, 2);
function a(b, c) {function arguments() {} =====> 输出 arguments()console.log(arguments);}a(1, 2);