词法作用域(Lexical Scope):在JavaScript中,一个变量的作用域是在写代码的时候就决定了的,这就是词法作用域。换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变(除了特殊的eval或with情况)。
function outer() {
let x = 1;
function inner() {
let y = 2;
// 在这里,我们可以访问x和y
}
// 在这里,我们只能访问x,不能访问y
}
在这个例子中,inner函数形成了一个闭包,它可以访问其自身作用域内的y变量,也可以访问包含它的outer函数的作用域内的x变量。这就是词法作用域的一个例子。
词法环境(Lexical Environment):在ECMAScript规范中,词法环境是一种规范类型,用于定义变量和函数的关联。一个词法环境由环境记录(用于记录变量和函数)和一个可能的引用到外部词法环境的链接组成。
当JavaScript代码执行时,会创建词法环境来存储在代码执行过程中创建的变量和函数。每个执行上下文都有一个与之关联的词法环境,当执行流进入一个由函数、模块、脚本或者with语句创建的块时,会创建一个新的词法环境。
词法环境和词法作用域是紧密相关的,词法环境提供了存储变量和函数的地方,而词法作用域则决定了这些变量和函数在代码中的可见性。