2188 votes

JavaScript Portée Des Variables

Quelle est la portée des variables en javascript? Ont-ils le même champ d'application à l'intérieur, par opposition à l'extérieur d'une fonction? Ou faut-il le même problème? Aussi, lorsque les variables sont enregistrées que si elles sont définies à l'échelle mondiale?

2677voto

Triptych Points 70247

Je pense que le mieux que je puisse faire est de vous donner un tas d'exemples pour l'étude. Les programmeurs Javascript sont pratiquement classé par la façon dont ils comprennent la portée. Il peut parfois être très contre-intuitif.

  1. À l'échelle mondiale dont l'étendue est variable

    var a = 1;
    
    // global scope
    function one() {
      alert(a);
    }
    
  2. Portée locale

    var a = 1;
    
    function two(a) {
      alert(a);
    }
    
    // local scope again
    function three() {
      var a = 3;
      alert(a);
    }
    
  3. Intermédiaire: Aucune une telle chose comme le bloc de portée en JavaScript

    var a = 1;
    
    function four() {
      if (true) {
        var a = 4;
      }
    
      alert(a); // alerts '4', not the global value of '1'
    }
    
  4. Intermédiaire: les propriétés de l'Objet

    var a = 1;
    
    function five() {
      this.a = 5;
    }
    
  5. Avancé: Fermeture

    var a = 1;
    
    var six = (function() {
      var foo = 6;
    
      return function() {
        // JavaScript "closure" means I have access to foo in here,
        // because it is defined in the function in which I was defined.
        alert(foo);
      };
    })();
    
  6. Avancé: Prototype de base de résolution de portée

    var a = 1;
    
    function seven() {
      this.a = 7;
    }
    
    // [object].prototype.property loses to
    // [object].property in the lookup chain. For example...
    
    // Won't get reached, because 'a' is set in the constructor above.
    seven.prototype.a = -1;
    
    // Will get reached, even though 'b' is NOT set in the constructor.
    seven.prototype.b = 8;
    
  7. Au total

    // These will print 1-8
    one();
    two(2);
    three();
    four();
    alert(new five().a);
    six();
    alert(new seven().a);
    alert(new seven().b);
    

  8. Global+Local: Un supplément de Cas complexes

    var x = 5;
    
    (function () {
        console.log(x);
        var x = 10;
        console.log(x); 
    })();
    

Cela permettra d'imprimer undefined et 10 plutôt que d' 5 et 10. Vous pouvez l'essayer.

241voto

krosenvold Points 35979

Javascript utilise portée des chaînes d'établir la portée pour une fonction donnée. Il y a généralement une portée globale, et chaque fonction a son propre imbriquée portée. Toute fonction définie à l'intérieur d'une autre fonction a une portée locale, qui est lié à la fonction externe. C'est toujours la position de la source qui définit le champ d'application.

Un élément dans le champ d'application de la chaîne est essentiellement une Carte avec un pointeur vers son parent.

Lors de la résolution d'une variable javascript commence au plus profond de la portée et de la recherche vers l'extérieur.

114voto

Jon Skeet Points 692016

Les Variables déclarées à l'échelle mondiale ont une portée mondiale. Les Variables déclarées dans une fonction sont limités à cette fonction, et de l'ombre des variables globales du même nom.

(Je suis sûr qu'il y a de nombreuses subtilités que les vrais programmeurs JavaScript sera en mesure de préciser dans d'autres réponses. En particulier, je suis tombé sur cette page à propos de quoi exactement, this signifie à tout moment. Espérons que cette plus introductive lien est assez pour vous obtenir a commencé.)

42voto

geowa4 Points 17712

Voici un exemple:

<script>

var globalVariable = 7; //==window.globalVariable

function aGlobal( param ) { //==window.aGlobal(); 
                            //param is only accessible in this function
  var scopedToFunction = {
    //can't be accessed outside of this function

    nested : 3 //accessible by: scopedToFunction.nested
  };

  anotherGlobal = {
    //global because there's no `var`
  }; 

}

</script>

Vous aurez envie d'enquêter sur les fermetures, et comment les utiliser pour faire des membres privés.

33voto

James McMahon Points 14356

La clé, ce que je comprends, c'est que Javascript a niveau de la fonction de cadrage vs le plus commun du bloc C de portée.

Voici un bon article sur le sujet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X