function a() { function c(){ cc = 4; function d() { console.log(cc);//4 } d(); } c(); console.log(cc);//4 } a(); console.log(cc);//4 console.log(window.cc);//4
很明顯當未使用var定義變量時,cc變量被定義於全局變量,javascript
可是,真的只要不使用var就會被掛入window嗎?其實不是,看下列代碼java
1 function a() { 2 var bb = 3; 3 var cc = 5; 4 function c(){ 5 cc = 4; 6 function d() { 7 console.log(cc);//4 8 } 9 10 d(); 11 } 12 13 c(); 14 console.log(cc);//4 15 } 16 a(); 17 console.log(cc); //undefined 18 console.log(window.cc); //underfined
是否很驚奇,此時cc被掛入了a函數裏定義的cc,因此是否有領悟:node
當未用var定義變量的時候,javascript引擎會檢索做用域層級來解析用戶名,從做用域鏈中一層一層往上查找變量,若是查找獲得,邊改變其值,若是整個做用域鏈中都查找不到,便會掛入window(nodejs爲global),成爲全局變量閉包
簡單來講就是無論函數被在哪裏調用,函數的做用域鏈早就在定義函數的時候固定了。模塊化
此特性被普遍用於模塊化,閉包。函數