Firefox interpretiert Funktionsanweisungen anders und hat offenbar das Deklarations-Hoisting für die Funktionsdeklaration aufgehoben. ( Eine gute Lektüre über benannte Funktionen / Deklaration vs. Ausdruck )
Der Grund für die unterschiedliche Interpretation der Anweisungen durch Firefox ist der folgende Code:
if ( true ) {
function test(){alert("YAY");}
} else {
function test(){alert("FAIL");}
}
test(); // should alert FAIL
Aufgrund der Deklarationserhöhung, Funktion test
sollte immer "fail" anzeigen, aber nicht in Firefox. Der obige Code meldet tatsächlich "YAY" in Firefox, und ich vermute, dass der Code, der dafür sorgt, dass das Deklarations-Hoisting schließlich ganz wegfällt.
Ich nehme an, dass Firefox Funktionsdeklarationen in var-Deklarationen umwandelt, wenn sie sich in if/else- oder try/catch-Anweisungen befinden. Zum Beispiel so:
// firefox interpretted code
var test; // hoisted
if (true) {
test = function(){alert("yay")}
} else {
test = function(){alert("fail")}
}
Nach einer kurzen Debatte mit Šime Vidas muss ich sagen, dass der Umgang von Firefox mit Funktionsdeklarationen nicht standardisiert ist, weil:
Die Produktion SourceElement : Anweisung wird für Funktion verarbeitet deklarationen durch Nichtstun .
Die Produktion SourceElement : Anweisung wird wie folgt ausgewertet:
- Aussage auswerten.
- Rückgabe Ergebnis(1).
Sowohl FunctionDeclaration als auch Statement sind SourceElements, ergo sollte es keine FunctionDeclarations innerhalb eines Statements geben (if/else, try/catch). Geben Sie Šime Vidas einen Brownie!
Try/catch ist im Grunde eine andere Form von if/else und verwendet wahrscheinlich denselben Ausnahmecode.