詞法作用域和動態作用域
1、作用域:
作用域是指程序代碼中定義變量的區域
JavaScript采用詞法作用域,也就是靜態作用域
2、詞法作用域和動態作用域
因為JavaScript采用的是詞法作用域,函數的作用域在函數定義的時候就決定了。
而與詞法作用域對應的是動態作用域,函數的作用域是在函數調用的時候才決定的。動態作用域並不關心函數和作用域是如何聲明以及在何處聲明的,只關心他們從何處調用。換句話說,作用域鏈是基於調用棧的,而不是代碼中的作用域嵌套。
var value = 1; function foo() { console.log(value); } function bar() { var value = 2; foo(); } bar(); // 結果是???
假設JavaScript采用靜態作用域,分析執行過程:
執行foo()函數,先從foo函數內部查找是否有局部變量value,如果沒有,就根據書寫的位置查找上一層的代碼,也就是value 等於 1,所以結果會打印 1 。
假設JavaScript采用動態作用域,分析執行過程:
執行foo()函數,依然是從foo函數內部查找是否有局部變量value,如果沒有,就從調用函數的作用域也就是bar()函數內部查找value變量,所以結果會打印 2 。
前面已經說了,JavaScript采用的是詞法作用域,所以這個例子結果是1
參考文章:https://www.cnblogs.com/xiaohuochai/p/5700095.html