javascript 基础之作用域

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

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