首先我們來看一段程式碼,然後通過分析這段程式碼來說明作用域鏈的這個問題,程式碼如下:
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作用域下的執行順序,如下圖:
1 如何區分私有的和全域性的?
第一:在全域性作用域下宣告(預解析)的變數是全域性變數。<br>
第二:在私有作用域中生成的變數和函式的形參都是私有變數。
第三:如果在私有作用域中遇到一個變數,如果能判斷是私有變數,那麼它與外界的任何內容都沒有關係。如果不是私有變數,那麼則往當前作用域的上一級進行查詢,如果上級也沒有,一直往上查詢,直到window。(其實這個就是作用域鏈)
複製程式碼
2 函式的私有作用域的執行順序
當函式在執行的時,執行的是函式體內的內容,所以函式首先會形成一個新的私有的作用域。
第一步:函式的有形參,那麼就先給形參賦值
第二步:進行私有域中的預解釋
第三步:私有域中的程式碼從上到下的執行
如下圖是:函式體執行的順序:
複製程式碼
函式形成一個新的作用域,用來保護裡面的私有變數,不受到外界變數的影響,同時也不影響外界變數,這種情況我們叫“閉包”
作用域的預解析對於var變數只是定義但是不會賦值,賦值是在執行的時候進行賦值的
函式裡面判斷是否是私有的變數,就看是否是形參和前面是否有var宣告符號