《你不知道的JavaScript(上)》筆記——動態做用域

動態做用域讓做用域做爲一個在運行時就被動態肯定的形式, 而不是在寫代碼時進行靜態肯定的形式。動態做用域並不關心函數和做用域是如何聲明以及在何處聲明的, 只關心它們從何處調用。 換句話說, 做用域鏈是基於調用棧的, 而不是代碼中的做用域嵌套。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

相關文章
相關標籤/搜索