2011-03-24 63 views
7
function A() { 
    function B() { 
      ... 
    }   
    B(); 
} 

功能B每次調用A或者是否有一些緩存。是不是讓它像本地一樣:緩存本地函數聲明嗎?

function A() { 
    B(); 
} 
function B() { 
    ... 
} 

顯着的性能改進?

是否有效做到這一點的風格選擇? (B在這種情況下只是A的輔助功能。)或者第二個應該受到速度的青睞?

爲了便於閱讀,應該使用還是避免使用此樣式?

Benchmark

似乎FF4爲本地情況內聯B並消除了函數調用開銷。

其他瀏覽器呢?

+0

在另一個裏面聲明一個函數是不好的。在你的第一個例子中B()應該是一個表達式。看到這裏:http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascript – DanMan 2011-03-24 18:06:50

+1

它看起來像你的測試案例是不正確的;你實際上並沒有執行這些函數,只是聲明它們。結帳http://jsperf.com/inner-function-optimization。 Chrome似乎沒有優化。我懷疑任何引擎會。 – Matt 2011-03-24 18:38:22

+0

@Matt哦..我忘了給他們打電話。多麼愚蠢:( – Raynos 2011-03-24 20:18:49

回答

4

在JS中聲明一個內部函數的目的可能是在詞彙上綁定到外部函數的局部變量/參數。把它移出來成爲一個頂級的功能就會失去這個目的。

要回答的問題是:是的,內在功能創建的每個時間,至少在理論上,這是寫代碼時,你應該如何看待它,但一個聰明的優化器仍可以將其轉換爲一個頂級函數,即使你有詞彙依賴關係。如果這是一個微型優化,我不會因爲擁有一個內部函數而達到可讀性和聲明你的意圖的目的。

0

Raynos,我看着你的jsperf測試,看起來你正在測試函數聲明,而不是函數執行。

請參閱下面的鏈接。這有幫助嗎?

Another benchmark

我要說的是:

  1. 在你的示例代碼,B創建的每個被調用的時間。 (在我上面的示例中,請參閱外部普通測試。)

  2. 百分比方面,性能改進很顯着。但是,如果真實世界的功能以微秒運行,您可能不會注意到其中的差異。

  3. 另一個考慮是B(輔助函數)是「私人」(換句話說,只在A內部可見)它有多重要。查看我的鏈接中的外部即時功能以獲得中途選項。

+0

很遺憾,瀏覽器不會使用緩存來優化這個功能。 – Raynos 2011-03-24 20:21:25

0

這很奇怪,因爲我猜測每次調用另一個函數時會重新聲明函數會減慢執行時間。

有沒有人有這個答案?

我能想出的唯一解決方案是函數C必須保留範圍,移到全局函數,執行函數D,然後返回。而功能A通過執行保持在一個範圍內。有什麼想法嗎?

+0

它確實減慢了執行時間,我的基準沒有調用函數。 – Raynos 2011-03-25 11:20:50