javascript中兩種定義函數方式的差別以及函數的預編譯效果

我們知道在javascript中定義函數的方式有以下兩種:

function mm(){ }

這種形式是聲明一個函數,跟 var 聲明一個變量機制一樣,腳本在解釋執行之前會做預編譯處理。

var mm = function(){ }

這種形式是對一個變量賦值,雖然也做預編譯,但僅僅隻是給 mm 事先變量分配一個內存空間,而沒有做初始化。

代碼1:

 alert(a);//打印函數a的內存
 alert(b);//undefined
 alert(c);//JS報錯:“c”未定義 
 function a()
 {
 
 }
 
 var b = function(){};

代碼2:

 func(); //2
 func = function() {alert(1);};
 func(); //1
 function func() {alert(2);};
 func(); //1

可見:

Javascript並非完全的按順序解釋執行,而是在解釋之前會對Javascript進行一次“預編譯”。第一種方式定義的函數,javascript允許在函數定義之前被使用;第二種方式定義的函數,不能提前使用,因為其值是undefined。

發佈留言