Firefox interprète les instructions de fonction différemment et, apparemment, ils ont cassé la déclaration de levage pour la déclaration de la fonction. ( Une bonne lecture sur les fonctions nommées / déclaration vs expression )
Pourquoi est-ce que Firefox interpréter des énoncés différemment, c'est parce que le code suivant:
if ( true ) {
function test(){alert("YAY");}
} else {
function test(){alert("FAIL");}
}
test(); // should alert FAIL
En raison de la déclaration de levage, la fonction test
devrait toujours en alerte "échec", mais pas dans Firefox. Le code ci-dessus fait des alertes "YAY" dans Firefox et je soupçonne que le code qui fait qui arriver a finalement brisé la déclaration de levage tout à fait.
Je suppose que Firefox tourne les déclarations de fonction dans var déclarations lorsqu'ils sont situés dans le if/else ou les instructions try/catch. Comme suit:
// firefox interpretted code
var test; // hoisted
if (true) {
test = function(){alert("yay")}
} else {
test = function(){alert("fail")}
}
Après un bref débat avec Šime Vidas, je dois dire que Firefox ne traite qu'avec les déclarations de fonction est non-standard, en raison de:
La production SourceElement :
Instruction est traitée pour la fonction
les déclarations en ne prenant aucune mesure.
La production SourceElement : Déclaration
est évaluée de la façon suivante:
- Évaluer Déclaration.
- Résultat De Retour(1).
Les deux FunctionDeclaration et de Déclaration sont SourceElements, ergo, il ne devrait pas être FunctionDeclarations à l'intérieur d'un énoncé (si/d'autre, try/catch). Donner Šime Vidas un brownie!
Try/catch est fondamentalement une autre forme de if/else et probablement utilise le même code d'exception.