匿名函數預解析思考

關於Js中的預解析相信對js有所瞭解的程序猿都知道,舉個例子:javascript

alert(a);
var a = 10;

上面的這個例子會彈出 undefined ,解析過程:var a; alert(a);a = 10;java

javascript中的函數絕對是一道美麗的風景,那麼有匿名函數存在時,是怎麼解析的呢?下面看幾個例子,從中一窺究竟.函數

  • 實例1code

alert(f);  // function f(){alert(2);}
  function f(){
    alert(1);
}
alert(f); // function f(){alert(2);}
f();  // 2
function f(){
    alert(2);
}
f();  // 2

對於使用function語句聲明的函數,js解釋器就會在預編譯期間把函數處理,這個處理就是創建函數索引.索引

因此預解析期間對函數f創建索引,程序從上往下執行,函數f指向function f(){alert(1);},繼續往下,還有一個函數f,此時將第一創建的索引覆蓋掉,此時函數f指向的是function f(){alert(2);}.到這裏預解析階段結束,而後進行執行,第一次alert 顯然彈出function f(){alert(2);},第二次一樣也是,f()執行彈出2,第二次f()也一樣彈出2.ip

  • 實例2io

alert(f);//  function(){alert(2);}
        var f = function(){
            alert(1);
        }
        alert(f);// 1
        f(); //1
        function f(){
            alert(2);
        }
        f();// 1
        alert(f); // function(){alert(1)}

實例2實例1 相比,將第一個函數f寫成了匿名函數,預編譯階段,對匿名函數不作任何處理,直到執行期才按表達式逐行進行解釋,全部返回的結果就不同了.預解析期間獲得的函數是function f(){alert(2);},可是執行到匿名函數,將函數f從新賦值了,改變了函數f.編譯

  • 實例3function

alert(f);//   undefined
        var f = function(){
            alert(1);
        }
        f(); //  1
        var f = function(){
            alert(2);
        }
        f();//  2

兩個都是匿名函數,在預解析期間都沒有執行,因此第一次是undefined,以後進行賦值運算,依次顯示12class

相關文章
相關標籤/搜索