概述
静态作用域:指的是一段代码,在它执行之前就已经确定了它的作用域,简单来说就是在执行之前就确定了它可以应用哪些地方的作用域(变量)。
*用法:*先从函数内部查找变量,若没有,就沿着定义函数的位置,查找上一层代码,直到全局变量;
动态作用域:函数的作用域在函数调用的时候才决定的
*用法:*先从函数内部查询变量,若没有,就从调用函数的作用域,即函数的作用域内部查找变量的值;
js采用的词法作用域就是静态作用域
// 静态作用域
let a = 10;
function = fn() {
let b = 1;
console.log(a + b);
}
fn(); // 11
在创建fn函数时的时候就已经确定了它可以作用哪些变量,如果函数fn里面有变量a,如果没有就往上一级查找,这就是静态作用域;
// 动态作用域
function foo() {
console.log(a);
}
function der() {
var a = 3;
foo();
}
var a = 2;
der(); // 2
der调用,der里面的foo被调用,foo函数需要查找变量a,由于js是词法作用域(即静态作用域)。foo被解析时在全局作用域,所以只能在全局作用域中找a,输出结果为2,而非der作用域中的a。
如果js采用的是动态作用域,那么foo在der中调用,就会现在der中查找a的值
var scope = "global";
function checkscope() {
var scope = "local";
function f() {
return scope;
};
return f();
}
checkScope();
var scope = "global";
function checkScope() {
var scope = "local";
function f() {
return scope;
};
return f;
}
checkScope()();
两段代码都返回 local ,因为scope在f函数中找不到,所以会在函数定义时的作用域查找,所以都是 “local”