Maison > Article > interface Web > Explication détaillée des méthodes de déclaration var et exemples de portée de variable en JavaScript
Lorsque vous faites cette déclaration "implicite" dans le contexte actuel, le moteur JavaScript va d'abord chercher dans le contexte courant si cette variable a déjà été déclarée. Sinon, allez dans le contexte précédent pour la rechercher. Si elle n'a pas été trouvée, nous déclarerons enfin cette variable sur la fenêtre !
window. y = "hello"; function func(){ y = "OH, NO!!!"; } func(); alert(window.y); //#=> display "OH, NO!!!"
Lorsqu'un calque du contexte a une telle variable définie "implicitement", la variable de ce calque sera modifiée sans générer de nouvelle variable dans la fenêtre.
var x = "window.x"; function a() { var x = "a's x"; var b = function() { var c = function() { //no var! x = "c's x:"; }; alert("before c run,the b.x:" + x); c(); alert("after c run, the b.x:" + x); }; alert("a.x is:" + x); b(); alert("after b function runed, the a.x is:" + x); }; alert("before a run, window.x:" + x); a(); alert("after a run, window.x:" + x);
Pensées déclenchées par une question
1. Doutes causées par un morceau de code
for(var i=0;i<3;i++) { console.log(j+","+k); for(var j=0;j<3;j++) { var k = j+1; } } console.log(i);
Résultat de sortie :
undefined,undefined 3,3 3,3 3
Si vous êtes engagé dans des langages tels que C et Java, vous pouvez être confus. Pourquoi les variables locales comme j et k peuvent-elles être accessibles par du code en dehors de la portée ?
Si une variable déclarée avec var en JavaScript peut être considérée comme une variable locale, alors la portée qui peut accéder à la variable est la portée locale de la variable. Comme dans l'exemple ci-dessus, sur la ligne console.log, il y a toujours les portées de j et k, et en dehors de la boucle, il y a toujours la portée de i. À ce stade, je peux peut-être dire arbitrairement que JavaScript n’a pas de véritable portée locale. Vraiment? Non!
2. Comment obtenir le périmètre local réel ? Une méthode d'écriture a retenu mon attention
Vous avez peut-être vu le code source de JQuery ou le code source d'Ext, et vous connaissez peut-être un peu la méthode d'écriture suivante.
var a = 3,b=4; var exports = (function() { var a = 1,b=2; return {a:a,b:b}; })(); console.log(""+a+","+b); console.log(exports.a+","+exports.b);
Résultat de sortie :
3,4 1,2
C'est une découverte très magique (en fait ce n'est pas magique, tout le monde le sait) il y a une portée indépendante à l'intérieur de la fonction, c'est-à-dire que les variables de fonction déclarées avec var interne ne peuvent être utilisées qu'à l'intérieur de la fonction. Par conséquent, chaque maître de chaque framework écrit de cette manière pour éviter les conflits entre les variables locales et les variables externes (variables locales externes et variables globales).
À ce stade, je retire l'inférence arbitraire du premier article et la modifie :
JavaScript est délimité par des fonctions, et chaque fonction a une portée locale sur tout autre bloc (y compris les blocs de code ordinaires, les boucles for, If ; , while et autres blocs de code) n'ont pas de portée locale. Les variables déclarées à l'aide de var peuvent passer directement à travers ces blocs de code et sont accessibles par du code externe.
3. Quand une erreur est-elle signalée et quand est-elle indéfinie ? Mécanisme de déclaration var
Regardez le code :
console.log(a)
ReferenceError: a is not defined
undefined
var exports = (function() { var a = 1,b=2; return {a:a,b:b}; })(); console.log(a);
Résultat de sortie :
ReferenceError: a is not defined
Devinez la conclusion :
Chaque fois que le moteur JavaScript exécute du code, il analysera d'abord tout le code dans la portée (le code à l'intérieur de la fonction dans la portée ne sera pas analysé) et enregistrera toutes les variables déclarées par var avant que le code ne soit exécuté. à l'affectation, la valeur de ces variables n'est pas définie. Après cela, si vous accédez à une variable, vous accéderez d'abord à la variable locale. S'il n'existe pas de variable locale, vous accéderez à la variable locale du niveau supérieur (comme une fermeture, et le niveau supérieur crée un environnement pour la variable locale). fermeture) jusqu'à ce que la variable globale complète soit accédée. S'il n'existe pas de variable de ce type, une exception est levée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!