2015-01-03 122 views
3
if (true) { 
    function foo(){ return 1; } 
} 
else { 
    function foo(){ return 2; } 
} 
foo(); 

上面的代碼是函數表達式的一個例子,在Firefox 28中返回1,而在Chrome中返回2(預期結果)。爲什麼Firefox給出錯誤的結果?Firefox上的函數表達式 - 不是預期的結果

+0

可能是'chrome'在執行任何代碼行之前加載函數表達式,而'firefox'會在其解釋器到達函數聲明行時執行嗎? – BatScream

+0

如果chrome手動加載這些表達式,第二個'foo()'聲明會替換它的第一個聲明? – BatScream

+1

[有條件聲明的函數](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function#Conditionally_created_functions)。注意,你擁有的是一個函數聲明,而不是一個表達式。 – Teemu

回答

0

這是一個函數提升的情況。任何使用相同函數名稱聲明的函數,該名稱的最後一個函數將獲得優先權,並且即使它爲空也將被使用。 在大多數情況下,函數聲明是在腳本執行前處理的,但是,對於Firefox而言,情況並非如此,因爲它在if塊中。

+1

「[FF]就是這樣」,是的,但只有在函數聲明在「if」塊內。當在「if」塊之外聲明時,FF提升機聲明函數以及其他瀏覽器。 – Teemu

相關問題