3
if (true) {
function foo(){ return 1; }
}
else {
function foo(){ return 2; }
}
foo();
上面的代碼是函數表達式的一個例子,在Firefox 28中返回1,而在Chrome中返回2(預期結果)。爲什麼Firefox給出錯誤的結果?Firefox上的函數表達式 - 不是預期的結果
if (true) {
function foo(){ return 1; }
}
else {
function foo(){ return 2; }
}
foo();
上面的代碼是函數表達式的一個例子,在Firefox 28中返回1,而在Chrome中返回2(預期結果)。爲什麼Firefox給出錯誤的結果?Firefox上的函數表達式 - 不是預期的結果
這是一個函數提升的情況。任何使用相同函數名稱聲明的函數,該名稱的最後一個函數將獲得優先權,並且即使它爲空也將被使用。 在大多數情況下,函數聲明是在腳本執行前處理的,但是,對於Firefox而言,情況並非如此,因爲它在if塊中。
「[FF]就是這樣」,是的,但只有在函數聲明在「if」塊內。當在「if」塊之外聲明時,FF提升機聲明函數以及其他瀏覽器。 – Teemu
可能是'chrome'在執行任何代碼行之前加載函數表達式,而'firefox'會在其解釋器到達函數聲明行時執行嗎? – BatScream
如果chrome手動加載這些表達式,第二個'foo()'聲明會替換它的第一個聲明? – BatScream
[有條件聲明的函數](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function#Conditionally_created_functions)。注意,你擁有的是一個函數聲明,而不是一個表達式。 – Teemu