JavaScript[16] -- 解析順序

編譯

  • 先去查找第一個做用域裏面全部的聲明,var,function,聲明不賦值賦值在執行期
  • 代碼進行靜態分析,找聲明變量,函數,檢測語法是否符合規範函數

    <script>
    
        // 1.function權重比var高
        // 在var和function聲明同一個變量的時候函數會覆蓋var
        alert(a);       // 結果爲 function a(){}
        var a = 0;
        function a(){};
    
        // 2.靜態檢測語法是否符合規範
        function b(){
            return x + y = 1;   // 執行前 = 號報錯
        };
    
    </script>

執行期

  • 運行js代碼,執行期裏面有新的做用域,新的做用域就會被激活,重新開始編譯-執行,依次類推this

    <script>
    
       console.log(a);    // undefined
        fun();             // undefined
        var a = 10;
        function fun(){
            console.log(a);
        }
        console.log(a);    // 10
    
        var x = 5;
    
        func();
    
        function func(){
            console.log(x);         // undefined
            var x = 10;
            console.log(x);         // 10
            console.log(this.x)     //  5
        }
    
        console.log(x);             // 5
    
        /*
           1.編譯
               x
               function func(){}
           2.執行期
               func()自執行,產生新的做用域
                       1.編譯:
                           var x;
                       2.執行期
                           x => undefined  (本做用域裏的x,還未被賦值)
                           x => 10;        (本做用域裏的x,已經被賦值)
                           this.x => 5     (自啓動函數,this指向window)
               返回上一個做用域繼續執行--
               console.log(x);     (本做用域裏的x,被賦值)
               x = > 5
               最後一行直接報錯,不能訪問內部變量
        */
       
        function m(){
            var n = 1;
            console.log(n);
        }
        function m(){
            var n = 2;
            console.log(n);
        }
    
        m();            // 2 第二個m()覆蓋第一個m()
        var m = 3;      // 變量m覆蓋函數m
        console.log(m); // 3
        m();            // m is not a function   此時m是個變量,不是函數
    </script>
相關文章
相關標籤/搜索