探索javascirpt-做用域

1.使用var定義變量,和漏了var定義變量時的狀況

  

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),成爲全局變量閉包

2,javascript中的函數做用域是經過詞法來劃分的

  簡單來講就是無論函數被在哪裏調用,函數的做用域鏈早就在定義函數的時候固定了。模塊化

  此特性被普遍用於模塊化,閉包。函數

相關文章
相關標籤/搜索