參考文章: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