javascript - Confusion avec un exemple de déclaration de fonction dans Elevation
淡淡烟草味
淡淡烟草味 2017-06-26 10:50:47
0
2
690

"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 !

淡淡烟草味
淡淡烟草味

répondre à tous(2)
为情所困

true est un littéral, pas une variable. Le navigateur optimisera directement votre instruction if lors de l'analyse, comme ceci :

if(true){
    function sayHi(){
        alert("Hi!");
    }
} else {
    function sayHi(){
        alert("Yo!");
    } 
}

变成
function sayHi(){
    alert("Hi!");
}

Cependant, l'auteur fait référence à une autre situation


if(condition){
function sayHi(){
    alert("Hi!");
    }
} else {
    function sayHi(){
        alert("Yo!");
    } 
}
var condition = true
sayHi()
三叔

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal