JS 词法作用域(静态作用域)

149 阅读1分钟

在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