在JavaScript中,词法作用域是在编写代码时作用域是静态的,由写代码时代码所处的位置决定的(也就是,写代码时将变量和块作用域写在哪决定的)
简单来说,词法作用域就是在你写代码的时候就确定了的作用域,而不是运行时确定的。所以也叫,静态作用域
在JS中,词法作用域通过函数声明的位置来确定作用域
function fn1() { console.log(a); }
function fn2() {
var a = 2;
fn1()
}
var a = 1;
fn2() // 1
上述代码,fn2函数在 a 被声明前就定义了,所以 fn2 作用域链包含了全局作用域,fn2 可以访问到 a 的值1
function fn1() { console.log(a); }
function fn2() {
var a = 2;
fn1(); // 输出undefined
}
fn2()
上述代码,fn1 函数在 a 被声明之后定义,所以 fn1 的作用域链不包括 fn2 的作用域,因此不能访问到 a 的值2,输出 undefind