9
votes

Pourquoi la variable ombrée est-elle évaluée à indéfinie lorsqu'elle est définie en périmètre extérieur?

Considérez la pièce de code suivante: xxx

La sortie de ce code est que la zone d'alerte affiche le message "À l'extérieur Portée ". Mais si je modifie légèrement le code comme: xxx

La zone d'alerte affiche le message" indéfini ". je pourrais avoir compris la logique s'il affiche "indéfini" dans les deux cas. Mais ça ne se passe pas. Il affiche "indéfini" uniquement dans le second cas. Pourquoi est-ce?

Merci d'avance pour votre aide!


0 commentaires

6 Réponses :


12
votes

Dans le premier cas, votre code accède à la variable globale "extérieure_scope", qui a été initialisé en "Portée extérieure".

JavaScript dispose d'une portée de niveau de fonction, donc dans le second cas, il accède à la fonction Fonction variable "extérieure_scope", mais elle n'a pas encore été initialisée au moment de la boîte d'alerte. Donc il affiche indéfini.


0 commentaires

4
votes

Dans le deuxième exemple, la variable locale existe pour toute la portée de la fonction. Peu importe que vous l'avez défini après l'alerte, il existe pour toute la fonction.

Cependant, l'affectation réelle ne se produit qu'après l'alerte, d'où le "indéfini".


0 commentaires

1
votes

C'est un cas intéressant.

Dans le premier exemple, vous avez défini une variable «globale». Il a une portée globale et est donc accessible dans n'importe quelle fonction / objet pour l'exécution.

Dans le deuxième exemple, vous avez «bloqué» la variable globale avec la variable d'étendue de la fonction, mais comme il n'a pas encore été initialisé au moment de l'alerte, il renvoie «indéfini».

Je suis d'accord Ce n'est pas l'ennemi le plus intuitif, mais cela a du sens.


0 commentaires

5
votes

JavaScript a la portée de la fonction, ne bloque pas la portée.

Dans le second cas, la déclaration d'extérieur_scope est hissée jusqu'au sommet de la fonction (mais l'affectation n'est pas).

Ceci est un excellent exemple de la raison pour laquelle le code JavaScript est plus facile à lire si vous mettez toutes vos déclarations variables en haut de la fonction. Votre deuxième exemple est équivalent à: xxx

et vous pouvez probablement maintenant comprendre pourquoi vous obtenez "indéfini".


0 commentaires

21
votes

Les variables sont soumises à hisser forts>. Cela signifie que peu importe l'endroit où une variable est placée dans une fonction, elle est déplacée en haut de la portée dans laquelle elle est définie.

Par exemple: P>

var outside_scope = "outside scope";
function f1() {
    var outside_scope; // is undefined
    alert(outside_scope) ;
    outside_scope = "inside scope";
}
f1();


1 commentaires

Après des années, je ne savais pas que, peut-être parce que je déclare toujours en haut, comme dans C.



2
votes

Ceci est dû à quelque chose appelé "Strong> hisser des déclarations variables .

Fondamentalement, JavaScript sépare une déclaration variable en deux , laissant la mission où vous avez fait la déclaration et hisser la déclaration réelle à le haut de la fonction : xxx

sur l'heure d'exécution, f1 () obtient traduit en f2 () . J'ai écrit un article de blog en profondeur sur ce ici . J'espère que cela vous aide à comprendre ce qui se passe dans votre code.

C'est aussi la raison, il est recommandé de déclarer vos variables en haut d'une fonction en JavaScript. Cela vous aide à comprendre ce que le code fait, quand il fonctionne.


0 commentaires