参考文章:git
JavaScript深刻之词法做用域和动态做用域github
JavaScript 采用词法做用域(lexical scoping),也就是静态做用域bash
由于 JavaScript 采用的是词法做用域,函数的做用域在函数定义的时候就决定了。函数
而与词法做用域相对的是动态做用域,函数的做用域是在函数调用的时候才决定的spa
例子:code
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar();
复制代码
假设JavaScript采用静态做用域,让咱们分析下执行过程:ip
执行 foo 函数,先从 foo 函数内部查找是否有局部变量 value,若是没有,就根据书写的位置,查找上面一层的代码,也就是 value 等于 1,因此结果会打印 1。作用域
假设JavaScript采用动态做用域,让咱们分析下执行过程:get
执行 foo 函数,依然是从 foo 函数内部查找是否有局部变量 value。若是没有,就从调用函数的做用域,也就是 bar 函数内部查找 value 变量,因此结果会打印 2。it
前面咱们已经说了,JavaScript采用的是静态做用域,因此这个例子的结果是 1