10
votes

Comprendre la fonction JavaScript Scoping

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


0 commentaires

4 Réponses :


4
votes

JavaScript n'a pas de périmètre de bloc (sauf dans Catch blocs).
Tous les énoncés var sont hostés en haut de la fonction contenant.

Par conséquent, vache fait référence à la variable locale n'importe où dans la fonction, même si le si ne s'exécute jamais.


1 commentaires

En fait, même les blocs ont leur propre portée ( variable environnement). Voir Pourquoi les clauses de capture ont-elles leur propre lexical environnement? pour plus de détails



9
votes

Les déclarations variables à l'intérieur des fonctions sont toujours hissées au sommet. Donc, votre code est en fait: xxx

à l'intérieur de la fonction que vous attribuez toujours à la vache , jamais le global.


3 commentaires

Je pense que vous voulez dire var cave, r là, pas var f, r


@ 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.



5
votes

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

  1. Toutes les variables dans une portée sont considérées comme déclarées au début de la portée
  2. une instruction IF ne crée pas de nouvelle portée.

    Votre exemple est équivalent à xxx

    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.


6 commentaires

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



4
votes

Vous n'avez pas vraiment lu cet article, n'est-ce pas? Il indique explicitement

fait vache est transformé en "colle" lorsque vous appelez f (2) ? Non, vache est en sécurité dans le code ci-dessus car la déclaration de vache à l'intérieur du bloc IF s'applique à l'ensemble de la fonction . Cela signifie que vache est une variable locale pour la fonction complète.

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.


0 commentaires