69 votes

Scope Chain en Javascript

J'ai lu la chaîne scope en Javascript, mais cela n'avait aucun sens pour moi. Est-ce que quelqu'un pourrait me dire ce qu'est la chaîne scope et comment elle fonctionne avec un graphique ou quelque chose que même un idiot peut comprendre. Je l'ai googlé mais je n'ai pas trouvé quelque chose de compréhensible :(

Merci d'avance.

74voto

CMS Points 315406

Pour comprendre la portée de la chaîne, vous devez savoir comment les fermetures de travail.

Une fermeture est formé lorsque vous nest les fonctions, les fonctions internes peuvent se référer aux variables présentes dans leur extérieur en joignant les fonctions, même après leur parent fonctions ont déjà été exécutée.

JavaScript résout les identificateurs dans un contexte particulier en parcourant le champ de la chaîne, le déplacement de l'localement à l'échelle mondiale.

Considérons cet exemple avec trois fonctions imbriquées:

var currentScope = 0; // global scope
(function () {
  var currentScope = 1, one = 'scope1';
  alert(currentScope);
  (function () {
    var currentScope = 2, two = 'scope2';
    alert(currentScope);
    (function () {
      var currentScope = 3, three = 'scope3';
      alert(currentScope);
      alert(one + two + three); // climb up the scope chain to get one and two
    }());
  }());
}());

Recommandé lit:

21voto

meder Points 81864

Aucune fonction dans ECMAScript ( langage de base que le JS est basé sur l' ) est séparé du contexte d'exécution, et s'exécute individuellement à partir de l'un de l'autre. À l'intérieur de chaque contexte d'exécution, this fait référence à l'objet en question, par défaut quelle que soit la fonction est attaché.

function foo() {
    alert(this===window)
}

Serait alerte vrai, parce que la fenêtre est l'objet qui possède la " foo " la méthode. Toutes les variables définies dans une fonction devenue accessible grâce à la fonction unique de la portée de la chaîne, de l'environnement.

function world() {
    var name = 'global';
    alert(name)
}

serait alerte "global" de toute évidence.

function world() {
    var name = 'global';
    (function() {
        var name = 'country';
        alert(name)
    })();
    alert(name)
}

Dans le dernier exemple en date, lors de la première alerte est invoquée, Javascript détermine que, dans le champ d'application de la chaîne de l'intérieur de la fonction que l'identificateur name est définie, donc il n'a pas à rechercher le champ d'application de la chaîne de l'attraper.

Dans la seconde alerte invocation, name est également définie dans le même contexte et les alertes "global";

function world() {
    var name = 'global';
    (function() { alert(name) })();
}

Dans cet exemple, l' name identifiant n'est pas défini dans le même contexte et il a ainsi le champ d'application de la chaîne à l'extérieur de la fonction où le nom est défini, et il avertit mondiale.

Référence:

5voto

Anatoliy Points 7775

C'est à propos de la fermeture. Vous pouvez utiliser des variables extérieures à la portée dans la portée interne:

 function get_inner_scope () {
    var outer = 'Outer variable value';
    return function () {
        alert(outer);
    }
}
f = get_inner_scope();
f(); // alerts Outer variable value
 

Plus d'informations détaillées avec d'autres exemples par le premier lien de Google: http://blogs.msdn.com/jscript/archive/2007/07/26/scope-chain-of-jscript-functions.aspx

1voto

ValidfroM Points 967

Vous trouverez ici de bons exemples de la chaîne d'étendue Javascript. Codelife.cybtamin.com/javascript-scope-chain-example/

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