Pour la portée des variables, des langues telles que C, Java adoptent la méthode "portée de bloc". En revanche, JavaScript adopte la méthode de la "portée de la fonction" - la portée de la variable n'est déterminée que par la fonction dans laquelle il est situé et n'a rien à voir avec les blocs logiques tels que si et pour. Par exemple, l'exemple suivant montre les comportements en JavaScript qui sont différents des langues telles que C et Java:
La copie de code est la suivante:
fonction(){
var s = 42; // s est visible tout au long de la fonction
if (s> 3) {
var x = "test"; // x est visible tout au long de la fonction
pour (var i = 0; i <10; i ++) {
console.log (i);
}
console.log (i); // i est visible tout au long de la fonction
}
console.log (i);
console.log (x);
}
Dans les langages "SPOCE" tels que C et Java, une fois les blocs logiques tels que si les instructions et pour les instructions sont terminées, les variables définies à l'intérieur de ces blocs logiques seront détruites. JavaScript est différent. Tant qu'une variable est définie dans une fonction, tous les codes de la fonction entière peuvent accéder à la variable, même si les codes sont avant la définition de la variable:
La copie de code est la suivante:
fonction(){
console.log (a); // non défini
var a = "test";
console.log (a); // tester
}
Dans l'exemple ci-dessus, si A n'est jamais défini dans la fonction, Console.log (a) lancera une perception de référence. Lorsque A est défini dans la fonction, même si cette définition est après l'instruction d'appel de variable, l'appel à A est une opération légale (si la définition d'une variable se produit après l'instruction d'appel, la valeur d'une variable dans l'instruction d'appel n'est pas définie). En fait, toutes les variables définies avec le mot-clé VAR dans la fonction seront soulevées au début de la fonction (l'opération d'attribution reste sur la ligne définie par le VAR), qui est appelée levée en JavaScript. Par exemple, le code ci-dessus est équivalent à:
La copie de code est la suivante:
fonction(){
var a;
console.log (a); // non défini
a = "test";
console.log (a); // tester
}
Chaîne de variables de portée
Contacter le stockage des variables en JavaScript peut fournir une bonne compréhension de la «portée de la fonction» et du hissage dans JS. Étant donné que les variables sont stockées sur des objets globaux ou des objets d'appel de fonction, lors de la définition d'une variable dans une fonction, peu importe où la variable est définie dans l'appel de fonction, une propriété avec le même nom que cette variable apparaîtra inévitablement dans l'objet d'appel de fonction utilisé par cet appel de fonction. Cela permet à la variable d'être accessible n'importe où dans la fonction.
En ce qui concerne les appels de fonction, il existe un autre concept plus intéressant dans JavaScript: la chaîne de portée des variables - puisque les variables sont stockées sur des objets globaux ou des objets d'appel de fonction, lors de l'accès aux variables, vous pouvez obtenir des valeurs à partir de plusieurs objets. Le code suivant est un exemple:
La copie de code est la suivante:
var x = "test";
fonction(){
// Fonction de niveau 1
var x = "temp";
fonction(){
// Fonction de niveau 2
var x = "réel";
// Essayez d'accéder à X ici. X sera "réel".
}
}
À l'intérieur de la fonction de niveau 2 dans le code ci-dessus, lorsque vous essayez d'accéder à la variable X, le programme peut rechercher les valeurs d'attribut correspondantes de 3 objets: l'objet d'appel de fonction utilisé pour appeler la fonction de niveau 2, l'objet de l'appel de fonction utilisé pour appeler la fonction de niveau 1, et l'objet global - Selon la relation imbriquée définie par la fonction, Javascript générera une chaîne d'objets composée de l'objet global et de l'objet d'appel de fonction. Lors de l'accès aux variables, le programme commencera à rechercher à partir de l'objet le plus proche de l'instruction d'accès. Si aucune recherche n'est trouvée, elle continuera de rechercher dans l'objet au niveau précédent dans la chaîne d'objets jusqu'à l'objet global.
Étant donné que cette chaîne d'objets est liée à la portée de la variable, elle est également appelée "chaîne de portée".
Si vous devez modifier temporairement la chaîne de portée et insérer un objet dans l'extrémité avant de la chaîne de portée (comme l'objet de fonction accessible en premier), vous pouvez utiliser l'instruction avec:
La copie de code est la suivante:
avec (o) {
// Code Utiliser les propriétés de l'objet o.
}
Cependant, en mode strict JavaScript, les instructions sont désactivées; Même en mode non strict, les déclarations ne sont pas recommandées.