萬盛學電腦網

 萬盛學電腦網 >> 網頁制作 >> 網頁設計 >> 分析Javascript 全局與局部作用域解析、作用域鏈

分析Javascript 全局與局部作用域解析、作用域鏈

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; 




以上便是 預解析過程, 不知道這樣寫能不能明白
copyright © 萬盛學電腦網 all rights reserved