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?
Réponses
Trop de publicités?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.
-
À l'échelle mondiale dont l'étendue est variable
var a = 1; // global scope function one() { alert(a); }
-
Portée locale
var a = 1; function two(a) { alert(a); } // local scope again function three() { var a = 3; alert(a); }
-
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' }
-
Intermédiaire: les propriétés de l'Objet
var a = 1; function five() { this.a = 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); }; })();
-
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;
-
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);
-
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.
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.
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é.)
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.