Portée des variables et des constantes
JScript possède trois portées : une portée globale, une portée locale et une portée de classe. Si vous déclarez une variable ou une constante en dehors d'une définition de fonction ou de classe, il s'agit d'une variable globale et sa valeur est accessible et modifiable dans tout le programme. En revanche, si vous déclarez une variable au sein d'une définition de fonction, il s'agit d'une variable locale. Elle est créée et détruite chaque fois que la fonction est exécutée ; il est impossible d'y accéder en dehors de la fonction. Si vous déclarez une variable à l'intérieur d'une définition de classe, cette variable est disponible au sein de la classe et il est impossible d'y accéder directement à partir de la portée globale. Pour plus d'informations, consultez Objets basés sur une classe.
Discussion
Des langages tels que C++ possèdent également une « portée de bloc » ; une paire d'accolades ({}) définit une nouvelle portée. JScript ne prend pas en charge les portées de bloc.
Une variable locale peut porter le même nom qu'une variable globale, mais elle n'en reste pas moins distincte. En conséquence, si vous modifiez la valeur d'une variable, cela n'a aucun effet sur l'autre. Au sein de la fonction dans laquelle la variable locale est déclarée, seule la version locale est significative. Ce concept porte le nom de visibilité.
// Define two global variables.
var name : String = "Frank";
var age : int = "34";
function georgeNameAge() {
var name : String; // Define a local variable.
name = "George"; // Modify the local variable.
age = 42; // Modify the global variable.
print(name + " is " + age + " years old.");
}
print(name + " is " + age + " years old.");
georgeNameAge();
print(name + " is " + age + " years old.");
La sortie de ce programme montre qu'une variable locale peut être modifiée sans changer la valeur de la variable globale. Des modifications apportées à la variable globale au sein d'une fonction n'affectent pas la valeur dans la portée globale.
Frank is 34 years old.
George is 42 years old.
Frank is 42 years old.
Dans la mesure où JScript traite les déclarations de variables et de constantes avant d'exécuter du code, il importe peu que la déclaration se trouve à l'intérieur d'un bloc conditionnel ou de toute autre construction. Après que JScript a trouvé toutes les variables et les constantes, il exécute le code dans la fonction. Cela signifie que la valeur d'une constante locale est non définie (undefined) jusqu'à ce que JScript atteigne la déclaration de constante et qu'une variable locale a la valeur undefined jusqu'à l'assignation d'une valeur à la variable dans la fonction.
Cela provoque parfois des résultats inattendus. Prenons l'exemple du programme suivant :
var aNumber = 100;
var anotherNumber = 200;
function tweak() {
var s = "aNumber is " + aNumber + " and ";
s += "anotherNumber is " + anotherNumber + "\n";
return s;
if (false) {
var aNumber; // This statement is never executed.
aNumber = 123; // This statement is never executed.
const anotherNumber = 42; // This statement is never executed.
} // End of the conditional.
} // End of the function definition.
print(tweak());
Le résultat généré par le programme est le suivant :
aNumber is undefined and anotherNumber is undefined
Vous pourriez penser que aNumber égale 100 ou 123 et anotherNumber 200 ou 42, mais les deux valeurs sont undefined. Dans la mesure où aNumber et anotherNumber sont définis avec une portée locale, ils occultent les constante et variable globales du même nom. Puisque le code qui initialise les variables et constante locales n'est jamais exécuté, leurs valeurs sont undefined.
La déclaration de variable explicite est requise en mode rapide. Lorsque le mode rapide est désactivé, une déclaration de variable implicite est requise. Une variable déclarée implicitement au sein d'une fonction, c'est-à-dire une variable qui apparaît à gauche dans une expression d'assignation sans le mot clé var, est une variable globale.