Maison > interface Web > js tutoriel > le corps du texte

Explication détaillée des méthodes de déclaration var et exemples de portée de variable en JavaScript

伊谢尔伦
Libérer: 2017-07-18 10:06:21
original
1467 Les gens l'ont consulté

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!!!"
Copier après la connexion

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);
Copier après la connexion

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);
Copier après la connexion

Résultat de sortie :

undefined,undefined 
3,3 
3,3 
3
Copier après la connexion

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);
Copier après la connexion

Résultat de sortie :

3,4 
1,2
Copier après la connexion

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)
Copier après la connexion
ReferenceError: a is not defined
Copier après la connexion
Copier après la connexion
undefined
Copier après la connexion
var exports = (function() { 
var a = 1,b=2; 
return {a:a,b:b}; 
})(); 
console.log(a);
Copier après la connexion

Résultat de sortie :

ReferenceError: a is not defined
Copier après la connexion
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!