動態做用域讓做用域做爲一個在運行時就被動態肯定的形式, 而不是在寫代碼時進行靜態肯定的形式。動態做用域並不關心函數和做用域是如何聲明以及在何處聲明的, 只關心它們從何處調用。 換句話說, 做用域鏈是基於調用棧的, 而不是代碼中的做用域嵌套。javascript
詞法做用域:java
function foo() { console.log( a ); // 2 } function bar() { var a = 3; foo(); } var a = 2; bar();
詞法做用域讓 foo() 中的 a 經過 RHS 引用到了全局做用域中的 a, 所以會輸出 2。函數
動態做用域:this
function foo() { console.log( a ); // 3(不是 2 ! ) } function bar() { var a = 3; foo(); } var a = 2; bar();
事實上 JavaScript 並不具備動態做用域,它只有詞法做用域 所以上述狀況只有詞法做用域是實際狀況code
主要區別: 詞法做用域是在寫代碼或者說定義時肯定的, 而動態做用域是在運行時肯定的。(this 也是! ) 詞法做用域關注函數在何處聲明, 而動態做用域關注函數從何處調用。ip