作用域
- 作用域:程序源代码中定义变量的区域。
- 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。
- 作用域分类:静态作用域(词法作用域)和动态作用域
JavaScript是静态作用域 - 静态作用域:函数的作用域在
函数定义
的时候就决定了 - 动态作用域:函数的作用域是在
函数调用
的时候才决定的
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar();
// 结果是 ???
JavaScript采用静态作用域,于是执行 foo 函数,先从 foo 函数内部查找是否有局部变量 value,如果没有,就根据书写的位置,查找上面一层的代码,也就是 value 等于 1,所以结果会打印 1。
如果是动态作用域的话,于是执行 foo 函数,依然是从 foo 函数内部查找是否有局部变量 value。如果没有,就从调用函数的作用域,也就是 bar 函数内部查找 value 变量,所以结果会打印 2。
思考
// case 1
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f();
}
checkscope(); //local scope
// case 2
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f;
}
checkscope()(); //local scope
结果都是
local scope
JavaScript采用的是词法作用域,函