Le
domaine
d’une variable est la partie de votre code dans laquelle une référence lexicale peut accéder à la variable. Une variable
globale
est une variable définie dans toutes les parties de votre code, alors qu’une variable
locale
est une variable définie dans une seule partie de votre code. Dans ActionScript 3.0, le domaine des variables est toujours limité à la fonction ou à la classe dans laquelle elles sont déclarées. Une variable globale est une variable que vous définissez en dehors de toute définition de classe ou de fonction. Par exemple, le code suivant crée une variable globale
strGlobal
en la déclarant en dehors de toute fonction. L’exemple indique qu’une variable globale est disponible à la fois à l’intérieur et à l’extérieur de la définition de fonction.
var strGlobal:String = "Global";
function scopeTest()
{
trace(strGlobal); // Global
}
scopeTest();
trace(strGlobal); // Global
Vous déclarez une variable locale en déclarant la variable à l’intérieur d’une définition de fonction. La plus petite partie de code pour laquelle vous pouvez définir une variable locale est une définition de fonction. Une variable locale déclarée dans une fonction existe uniquement dans celle-ci. Par exemple, si vous déclarez une variable appelée
str2
dans la fonction
localScope()
, cette variable n’est pas disponible en dehors de la fonction.
function localScope()
{
var strLocal:String = "local";
}
localScope();
trace(strLocal); // error because strLocal is not defined globally
Si le nom attribué à votre variable locale est déjà déclaré en tant que variable globale, la définition locale masque la définition globale tant que la variable locale est dans le domaine. La variable globale persiste en dehors de la fonction. Par exemple, le code suivant crée une variable globale de type chaîne appelée
str1
, puis une variable locale du même nom dans la fonction
scopeTest()
. L’instruction
trace
placée dans la fonction génère la valeur locale de la variable, tandis que celle qui est placée en dehors de la fonction génère la valeur globale de la variable.
var str1:String = "Global";
function scopeTest ()
{
var str1:String = "Local";
trace(str1); // Local
}
scopeTest();
trace(str1); // Global
Les variables ActionScript, contrairement aux variables dans C++ et Java, n’ont pas de domaine de niveau bloc. Un bloc de code est un groupe d’instructions placé entre une accolade d’ouverture (
{
) et une accolade de fermeture (
}
). Dans certains langages de programmation tels que C++ et Java, les variables déclarées dans un bloc de code ne sont pas disponibles en dehors de ce bloc de code. Cette restriction de domaine est appelée domaine de niveau bloc et n’existe pas dans ActionScript. Si vous déclarez une variable à l’intérieur d’un bloc de code, elle est disponible non seulement dans celui-ci mais également dans d’autres parties de la fonction à laquelle il appartient. Par exemple, la fonction suivante contient des variables définies dans différents domaines de bloc. Toutes les variables sont disponibles dans la fonction.
function blockTest (testArray:Array)
{
var numElements:int = testArray.length;
if (numElements > 0)
{
var elemStr:String = "Element #";
for (var i:int = 0; i < numElements; i++)
{
var valueStr:String = i + ": " + testArray[i];
trace(elemStr + valueStr);
}
trace(elemStr, valueStr, i); // all still defined
}
trace(elemStr, valueStr, i); // all defined if numElements > 0
}
blockTest(["Earth", "Moon", "Sun"]);
Une implication intéressante de l’absence de domaine de niveau bloc est que vous pouvez lire ou écrire dans une variable avant de la déclarer, tant qu’elle est déclarée avant que la fonction se termine. Ceci est dû à une technique appelée
hissage
, qui signifie que le compilateur déplace toutes les déclarations de variable en haut de la fonction. Par exemple, le code suivant compile même si la fonction
trace()
initiale pour la variable
num
se produit avant la déclaration de la variable
num
:
trace(num); // NaN
var num:Number = 10;
trace(num); // 10
Néanmoins, le compilateur ne hisse aucune instruction d’affectation. Ceci explique pourquoi la fonction
trace()
initiale de
num
fournit
NaN
(pas un nombre), qui est la valeur par défaut pour des variables du type de données Number. Cela signifie que vous pouvez affecter des valeurs à des variables même avant leur déclaration, comme indiqué dans l’exemple suivant :
num = 5;
trace(num); // 5
var num:Number = 10;
trace(num); // 10