關於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
,以後進行賦值運算,依次顯示1
和2
class