javascript 基础之词法作用域

词法作用域

作用域

作用域是指代码中定义变量的区域。 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。 JavaScript 采用词法作用域(lexical scoping),也是静态作用域

静态作用域

javascript 使用的是静态作用域, 函数的作用域在定义的时候就已经确定了


var value = 1;
function foo() {
    console.log(value);
}
function bar() {
    var value = 2;
    foo();
}
bar();

按照静态作用域查找变量的方式, 执行bar(), 然后遇到 foo 函数去执行, 会去定义foo函数的位置去查找变量value, 所以会输出1; 如果javascript 使用的是动态作用域的话, 就会从foo函数调用的位置去查找value变量, 就会打印2

// 例子
var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f();
}
checkscope();

分析: 遇到 checkscope函数,并执行, 再遇到f函数, checkscope执行结束返回函数f, 这里返回的结果是checkscope执行结束之前获取的值,会按照f函数定义时候创建的作用域去向上查找变量, 结果为local scope

// 例子1
var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}
checkscope()();

分析: 执行checkscope()函数接收到未执行的f函数,通过checkscope()()的方式去执行f函数,还是会去checkscope函数内部定义 f函数的位置去查找变量, 结果仍然是 local scope

JavaScript 函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。嵌套的函数 f() 定义在这个作用域链里,其中的变量 scope 一定是局部变量,不管何时何地执行函数 f(),这种绑定在执行 f() 时依然有效。 -- 权威指南

所以,函数的作用域是在定义时候创建的并确定了, 并不会因为调用时候的作用域不同而不同