2012-08-06 44 views
4

只是一個小理論性能問題:JQuery .each():匿名函數的性能?

,如果我有這樣的:

$(".somediv").each(function() { 
    // perform some heavy stuff here 
}); 

請問代碼的執行不會更快,如果我重構匿名函數的代碼,如命名函數:

f = function() { 
    // perform some heavy stuff here 
}; 

$(".somediv").each(f); 

不知怎的,我有這種不合理的懷疑告訴我,也許是匿名函數是重新創建每次每個循環中?

+2

不合理懷疑是不合理的 – Roest 2012-08-06 07:20:36

+0

嘗試刪除循環中不需要的任何東西,例如「在這裏執行一些沉重的東西」。聲明的變量應該在循環之外。你提到的兩個選項之間沒有太大的區別。 – 2012-08-06 07:25:27

+0

這就是http://jsperf.com/所設計的工具。此外,答案可能會從瀏覽器更改爲瀏覽器! – clee 2012-08-06 07:23:25

回答

3

如果您關注性能,那麼您不應該使用.each()。使用for循環或while循環迭代集合的內容要快得多,並且完全沒有函數調用,而不是使用.each()及其產生的每個項目的函數調用。

在回答你的問題時,匿名函數不會比命名函數慢。在運行時間之前的分析時間解決差異。

This jsPerf顯示了一個普通的for迴路,因爲它幾乎比.each()快了10倍:http://jsperf.com/each-vs-for-loop-mine

+0

您可以指出一些有關在解析時間而不是在運行時解決這些差異的參考嗎? 會[此答案](http://stackoverflow.com/a/81329/1081396)有意義嗎? – Alvaro 2016-07-11 11:35:04

0

它沒有被重新創建,它只創建一次,並且引用被傳遞給函數$.each()。該函數然後通過其引用調用匿名函數。

如果有差異,我認爲它不會有足夠的重要性,除了之外還有其他不同的模式,當其他人閱讀代碼時最容易理解。如果性能問題在您的代碼中彈出,請對其進行測量並找出瓶頸。這幾乎肯定不是來自這樣的事情。

1

讓我們考慮一下代碼(jQuery的1.7.1):

// "public" each 
each: function(callback, args) { 
    return jQuery.each(this, callback, args); 
} 

// "local" each 
each: function(object, callback, args) { 
    // [...] 

    if (args) { 
     // [ args is for internal use ...] 
    // A special, fast, case for the most common use of each 
    } else { 
     if (isObj) { 
      for (name in object) { 
       if (callback.call(object[name], name, object[name]) === false) { 
        break; 
       } 
      } 
      // [...] 

正如你所看到的,callback被引用和直接使用。沒有複製callback功能。不過,如果jQuery要複製函數,那麼您建議的解決方法會在 jQuery中產生相同的行爲

注意:在JavaScript中,函數是對象。一個函數聲明語法的行爲與另一個函數不同,沒有「非理性」原因。唯一的區別是範圍。你的建議的解決方法是使函數一個全球性的,而其他的匿名函數是「本地」的each呼叫