词法环境
每个执行上下文都有一个相关联的词法环境(简称环境)。
词法环境的定义:用于定义出现在上下文中的标识符与其值之间的关联的结构。从技术上讲,环境是由环境记录(Enviroment Record)(一个将标识符映射到值的实际存储表)以及对其外层环境的引用(可能为 null)组成的。
简而言之:环境是一种存储标识符到变量映射的结构。(这里,标识符指变量或者函数的名称,变量是对实际对象(包括函数对象和数组对象)的引用或者基础类型值)。
变量环境
变量环境也是一种词法环境,其环境记录保存该执行上下文内由VariableStatements(即 var 声明语句) 创建的绑定。
既然变量环境也是词法环境,因此它有词法环境的所有属性和组件。
在 ES6 中,词法环境组件与变量环境组件之间的一个区别是:
前者用于存储函数声明以及用 let 和 const 声明的变量绑定
后者只用于存储用 var 声明的变量绑定。
案例:
let a = 20;
const b = 30;
var c;
function multiply(e, f) {
var g = 20;
return e * f * g;
}
c = multiply(20, 30);
运行描述:
当代码运行时,JavaScript 引擎首先创建一个全局执行上下文来执行全局代码。
执行阶段,变量赋值完成。
当遇到调用函数 multiply(20, 30) 时,就创建一个新的函数执行上下文来执行该函数代码。
之后,该执行上下文进入执行阶段,该函数内的变量赋值已经完成。
该函数执行完成后,返回值被存储在 c 中。于是,全局词法环境就被更新了。之后,全局代码完成执行,程序结束。