Le code ci-dessous est le code JavaScript. J'essaie de comprendre la portée de la fonction en JavaScript et à la suite de l'article sur ici . Je reproduit le code ci-dessous -
var cow = "purple"; // just a random cow var f = function (x) { var r = 0; cow = "glue"; if (x > 3) { var cow = 1; // a local variable r = 7; } return r; }; var z = f(2); alert(cow); // returns purple
4 Réponses :
JavaScript n'a pas de périmètre de bloc (sauf dans Par conséquent, Catch code> blocs).
Tous les énoncés var code> sont hostés em> en haut de la fonction contenant. P>
vache code> fait référence à la variable locale n'importe où dans la fonction, même si le
si code> ne s'exécute jamais. P>
En fait, même les blocs code> code> ont leur propre portée ( variable i> environnement). Voir Pourquoi les clauses de capture ont-elles leur propre lexical i> environnement? pour plus de détails
Les déclarations variables à l'intérieur des fonctions sont toujours hissées au sommet. Donc, votre code est en fait: à l'intérieur de la fonction que vous attribuez toujours à la em> em> vache code>, jamais le global. p> p>
Je pense que vous voulez dire var cave, r code> là, pas
var f, r code>
@ Ben336 Oui, j'ai réparé cela il y a un moment. Peut-être que votre navigateur n'a pas reçu la notification d'édition? La chose de bande échoue parfois ...
Ouais le voir maintenant. Travailler avec une connexion de réseau spotty aujourd'hui. Je n'ai également pas vu que d'autres personnes avaient répondu que je posais la mienne.
Les deux choses à comprendre ici sont que les variables JavaScript sont hissées en haut de leur portée et que JavaScript n'a pas de périmètre de blocage.
SO P>
Votre exemple est équivalent à p> la déclaration de var dans la déclaration IF est hissée au sommet. À ce moment-là, toutes les références de vache dans la fonction se rapportent à la vache variable locale, plutôt que la vache de la portée extérieure. P> P>
il n'y a pas de var devant la vache = colle dans le tutoriel, je ne sais pas si c'est une erreur de l'auteur
Non, ce n'est pas une erreur nécessairement, si le but est de montrer comment fonctionne JS Scope. déclarant un var dans une déclaration si la déclaration est une mauvaise pratique parce que son déroutant, mais ce n'est pas "faux"
+1 Pour souligner que le bloc IF ne crée pas de nouvelle portée, cela peut très bien être la source du malentendu op.
@bfavaretto oups. Je ne peux même pas blâmer que sur les webockets :)
Bloquer la portée à venir bientôt. Voir le mot clé JS 'let'. Honnêtement cependant, je ne l'ai jamais manqué.
@Erikreppen Yep, vrai. Bien que cela ne puisse toujours pas aider cet exemple particulier
Vous n'avez pas vraiment lu cet article, n'est-ce pas? Il indique explicitement p>
fait
vache code> est transformé en
"colle" code> lorsque vous appelez
f (2) code>? Non,
vache code> est en sécurité dans le code ci-dessus car la déclaration de vache code> code> à l'intérieur du bloc IF s'applique à l'ensemble de la fonction em>. Cela signifie que
vache code> est une variable locale pour la fonction complète. P> blockQuote>
Toutefois, lorsque vous supprimez le bloc IF, vous supprimez également la déclaration de variable à l'intérieur, et que l'affectation ciblera la variable globale. P>