概念:
词法环境是JavaScript中用于定义标识符绑定(即变量和函数的名称)的规则和方式的一种规范概念。在ES6(ECMAScript 2015)及之后的版本中,词法环境被引入来替代之前的变量对象(Variable Object)和活动对象(Activation Object)的概念
一. 定义
词法环境是由两部分组成的:
1.环境记录(Environment Record):存储变量和函数声明的实际位置。
2.外部词法环境引用(Outer Lexical Environment):指向包含当前词法环境的下一个外部词法环境。
二. 环境记录
环境记录有两种类型:
1.声明式环境记录(Declarative Environment Record):用于函数和模块环境。它存储变量、函数和参数的绑定。
2.对象式环境记录(Object Environment Record):用于全局环境。它将绑定映射到对象的属性。
三. 词法环境的作用
1.标识符解析:当访问一个变量或调用一个函数时,JavaScript引擎会使用词法环境来查找这些标识符的绑定。
2.作用域链:词法环境构成了作用域链的一部分,它允许内部环境访问外部环境的变量和函数。
四. 词法环境的创建
每当执行一个函数时,都会创建一个新的词法环境。这个新的词法环境会包含以下内容:
1.环境记录:存储该函数内部声明的变量和函数。
2.外部词法环境引用:指向函数外部环境的词法环境。
五.示例
function outer() {
var outerVar = 'I am outer';
function inner() {
var innerVar = 'I am inner';
console.log(outerVar); // 输出:I am outer
}
inner();
}
outer();
在这个例子中:
1.outer() 的执行创建了一个包含 outerVar 和 inner() 的词法环境。
2.当 inner() 被调用时,它创建了一个新的词法环境,其中包含 innerVar。
3.inner() 的外部词法环境引用指向 outer() 的词法环境,因此 inner() 可以访问 outerVar。
六. 闭包
词法环境也是理解JavaScript闭包的关键。闭包允许函数访问并操作其外部词法环境中的变量,即使外部函数已经返回。
function createCounter() {
let count = 0;
return function() {
count += 1;
return count;
};
}
let counter = createCounter();
console.log(counter()); // 输出:1
console.log(counter()); // 输出:2
在这个例子中,返回的匿名函数可以访问并修改 createCounter 的词法环境中的 count 变量,即使 createCounter 已经执行完毕。这是因为返回的函数保存了对 createCounter 词法环境的引用。
05-16
956
