2016-02-28 53 views
2

在這個例子中:是否在每次調用時重新評估名稱空間函數?

function foo() { 
    function bar() { 
    return 'foo bar'; 
    } 
    bar(); 
} 
foo(); 

bar重新評估每一個Xfoo叫?

相反地:

function bar() { 
    return 'foo bar'; 
} 
function foo() { 
    bar(); 
} 
foo(); 

benchmark表明後面的例子是+/- 1.6倍更快(在Chrome)。

如果不重新評估,爲什麼第二種模式比第一種模式快得多?

+2

每次運行完整的函數體都會被評估。只要'bar'函數聲明是body的一部分 - 每次都會對它進行評估。 – zerkms

+0

謝謝。在問我之前,我只知道我的問題的答案 - 僅僅從實際經驗中得出。我想我的「線間」問題是,我將如何去驗證這個問題?它是否從瀏覽器更改爲瀏覽器?標準的「JavaScript如何工作?」谷歌搜索沒有產生有益的結果。 – jtrumbull

+0

函數被允許在內部被緩存,所以'bar()'可能不會每次都被100%重新創建(特別是函數體可以被緩存,因爲它是靜態的),但是它必須重新構建信封,而第二個則不需要這樣的設置成本。 – dandavis

回答

1

簡答:是的。

正如您在問題的註釋中所提到的,函數體中的所有內容都在您調用該函數時運行。

第二個例子更快,因爲它只需要調用一個先前初始化的函數,而在第一個例子中,代碼必須每次都重新初始化函數。基本上,每次調用foo()時都必須重複該工作,這會佔用額外的處理時間。

相關問題