class="area">
分析Javascript 全局與局部作用域解析、作用域鏈:<script>
alert(a); //undefault
var a = 1;
function fn1(){
alert(a); //undefault
var a = 2;
alert(a); //2
}
fn1();
</script>
一.JS解析器 (相當於把:var\function\參數 這3樣東西 提前解析放到一個倉庫裡)
1.‘找一些東西’:var\function\參數 (找這3樣東西)
所有變量在代碼運行之前,都提前賦一個值:未定義(undefault)
開始找全局var : 找到一個 var a = 未定義。 (只有一個)
開始找全局function : 找到一個 fn1 = function fn1(){
alert(a);
var a = 2;
alert(a);
}。 (只有一個)
開始找 ‘參數’,沒有。
到這裡JS解析完成。
接下來就開始第二步(逐行解讀代碼);
二.逐行解讀代碼
1.開始讀代碼
讀到 alert(a) 查看解析器(倉庫)是否有a的存在,如果有就輸出,結果是個undefault;
讀到 var a = 1 查看解析器(倉庫)是否有a的存在,如果有就修改,結果 a 變成了 1; (說明,表達式可以修改解析器同名的變量);
讀到 fn1,這裡是關鍵,因為這裡是局部作用域,所以又會再次的進行。JS解析器、逐行解讀代碼。
一.JS解析器
開始找局部var : 找到一個 var a = 未定義。 (只有一個);
沒有function 也沒有 參數 結果
二.逐行解讀代碼
讀到fn1()時,開始運動
讀到 alert(a) 查看局部解析器(倉庫)是否有a的存在,如果有就輸出,結果是個undefault;
讀到 var a = 2 查看解析器(倉庫)是否有a的存在,如果有就修改,結果 a 變成了 2; (說明,表達式可以修改解析器同名的變量);
讀到 alert(a) 查看局部解析器(倉庫)是否有a的存在,如果有就輸出,結果a 是存在的,因上一步a的值被修改為2;
以上便是 預解析過程, 不知道這樣寫能不能明白