"JavaScript Advanced Programming" Chapitre 7 Fonctions, concernant la promotion des déclarations de fonctions, il existe un exemple :
if(condition){
function sayHi(){
alert("Hi!");
}
} else {
function sayHi(){
alert("Yo!");
}
}
Le texte original du livre dit :
En apparence, le code ci-dessus signifie que lorsque la condition est vraie, utilisez une définition de sayHi(); sinon, utilisez une autre définition. En fait, il s'agit d'une syntaxe invalide dans ECMAScript, et le moteur JavaScript tentera de corriger l'erreur et de la convertir dans un état raisonnable. Mais le problème est que les navigateurs sont incohérents dans leurs tentatives pour corriger les erreurs. La plupart des navigateurs renverront la deuxième instruction, ignorant la condition ; Firefox renverra la première instruction si la condition est vraie. Cette utilisation est donc dangereuse et ne doit pas être utilisée dans votre code.
Mais je l'ai testé dans Chrome et js bin et j'ai changé la condition en true, et cela pourrait alerter "Bonjour". Il n'y a eu aucun problème du type "la plupart des navigateurs renverront la deuxième instruction et ignoreront la condition" mentionnée dans le livre This Why. :
if(true){
function sayHi(){
alert("Hi!");
}
} else {
function sayHi(){
alert("Yo!");
}
}
sayHi();// Hi!
Veuillez nous conseiller, merci !
true est un littéral, pas une variable. Le navigateur optimisera directement votre instruction if lors de l'analyse, comme ceci :
Cependant, l'auteur fait référence à une autre situation
Une fois que le compilateur a obtenu ce code, il constate qu'il existe deux déclarations de fonction en double dans la même portée. La première déclaration sera directement remplacée par la deuxième déclaration.
js ne recommande pas de déclarer des fonctions à l'intérieur de blocs.
En mode strict, ce code signale directement une erreur.