javascript作用域鏈

謙行發表於2013-08-25

首先我們來看一段程式碼,然後通過分析這段程式碼來說明作用域鏈的這個問題,程式碼如下:

console.log(total);
		var total=0;
		function fn(num1,num2){
			console.log(total);
			var total=num1+num2;
			console.log(total);
		}
		fn(100,200)
		console.log(total);
複製程式碼

這段程式碼輸出的結果為:

undefined
undefined
300
0

window作用域下的執行順序,如下圖:

window作用域下的

1 如何區分私有的和全域性的?

第一:在全域性作用域下宣告(預解析)的變數是全域性變數。<br>
第二:在私有作用域中生成的變數和函式的形參都是私有變數。
第三:如果在私有作用域中遇到一個變數,如果能判斷是私有變數,那麼它與外界的任何內容都沒有關係。如果不是私有變數,那麼則往當前作用域的上一級進行查詢,如果上級也沒有,一直往上查詢,直到window。(其實這個就是作用域鏈)
複製程式碼

2 函式的私有作用域的執行順序

當函式在執行的時,執行的是函式體內的內容,所以函式首先會形成一個新的私有的作用域。

第一步:函式的有形參,那麼就先給形參賦值
第二步:進行私有域中的預解釋
第三步:私有域中的程式碼從上到下的執行
如下圖是:函式體執行的順序:
複製程式碼

javascript作用域鏈

函式形成一個新的作用域,用來保護裡面的私有變數,不受到外界變數的影響,同時也不影響外界變數,這種情況我們叫“閉包”

作用域的預解析對於var變數只是定義但是不會賦值,賦值是在執行的時候進行賦值的

函式裡面判斷是否是私有的變數,就看是否是形參和前面是否有var宣告符號

相關文章