2011-03-25 83 views
14

的B/W函數聲明&函數式var functionName = function() {} vs function functionName() {}
精美描述在此它提到在分析時該函數聲明被評估的差別,&功能表達在執行相函數聲明比函數表達式快嗎?

評價在bytes.com它的提到函數聲明比函數表達式快。

我創建了這一個基本的測試案例:http://jsperf.com/function-declaration-vs-function-expression

函數聲明

function myfunc() { 
alert("yo"); 
} 
myfunc(); 

函數表達式

var myfunc = function() { 
alert("yo"); 
} 
myfunc(); 

試驗表明,函數表達式是慢90%韓函數聲明

爲什麼這樣的速度差異?

編輯
從結果中http://jsperf.com/function-declaration-vs-function-expression

Chrome, IE9, Opera & Safari - >函數聲明比函數表達式更快

Firefox, IE7, IE8 - >函數表達式比函數聲明更快

IE9函數聲明更快,而在IE 7中& 8函數表達式更快。 是因爲IE9中JavaScript引擎的變化,還是此舉有意?

+3

你使用什麼瀏覽器或JavaScript引擎? – 2011-03-25 14:37:22

+0

它實際上在Firefox中更快。 – 2011-03-25 14:38:58

+3

這些結果是非常有趣的,而在Chrome和Opera中它的速度卻慢了90%,實際上它在FF中速度更快。我會說,這並不重要,因爲如果你聲明瞭足夠的功能,這會成爲一個問題,那麼你做錯了什麼。 – idbentley 2011-03-25 14:40:27

回答

1

這必須是一個瀏覽器相關的問題。有些瀏覽器可能會以不同的方式編譯javascript,如果它是表達式而不是聲明,並且有些瀏覽器可能會完全相同地處理它們。

2

Firefox也有非標準的Function Statements,這使得在函數聲明(每個規範,你不能)中有條件地進行選擇成爲可能。只需使用example of Juriy "kangax" Zaytsev

if (true) { 
    function foo(){ return 1; } 
} else { 
    function foo(){ return 2; } 
} 
foo(); // 1 
// Note that other clients interpet `foo` as function declaration here, 
// overwriting first `foo` with the second one, and producing "2", not "1" as a result 

所以這些都是在執行時進行編譯,而不是在分析階段:

函數語句變量實例化過程中不被聲明。它們在運行時被聲明,就像函數表達式一樣。

其他瀏覽器可能會預編譯函數聲明,使它們在運行時執行速度更快,但Firefox已經在運行時解釋函數聲明,引起的壁虎函數聲明與函數表達式速度之間沒有太大的區別基於瀏覽器。

+0

_「Firefox必須在運行時解釋函數聲明」_這很糟糕。它是否在新版本中修復? – Anish 2011-03-25 15:37:06

+0

@Anish:固定?這是一個[功能](https://developer.mozilla.org/en/JavaScript/Reference/Statements/function):「JavaScript 1.5,NES 6.0:添加了條件函數聲明(Netscape擴展)」。也就是說,團隊正在儘可能快地製作JS引擎。 – 2011-03-25 16:08:01

+0

從_kangax的article_我知道,只有當它們是函數聲明的一部分時,Firefox纔會在運行時解釋函數聲明。當函數聲明被正常定義時,我猜他們是在解析時間期間定義的? – Anish 2011-04-01 06:30:33