Les variables et leurs accès

Parent Previous Next



Les variables et leurs accès



Avant d'attaquer l'étude des closures, il est de bon ton d'étudier un peu plus en profondeur de quelle manière sont gérées les variables par le Javascript.


Commençons par ce code :

function area() {

    var myVar = 1;

}

 

area(); // On exécute la fonction, ce qui crée la variable « myVar »

 

alert(myVar);


Même sans l'exécuter, vous vous doutez sûrement du résultat que nous allons obtenir : une erreur. Ceci est normal, car myVar est déclarée dans une fonction tandis que nous essayons d'y accéder depuis l'espace global (en cas d'oubli, nous vous invitons à relire cette sous-partie).


La seule fonction capable d'accéder à myVar est area(), car c'est elle qui l'a créée. Seulement, une fois l'exécution de la fonction terminée, la variable est supprimée et devient donc inaccessible.


Maintenant, si nous faisons ceci :

function area() {

 

    var myVar = 1;

 

    function show() {

        alert(myVar);

    }

 

}

 

area();

 

alert(myVar);


Le résultat est toujours le même, il est nul. Cependant, en plus de la fonction area(), la fonction show()est maintenant capable, elle aussi, d'accéder à myVar car elle a été créée dans le même espace que celui demyVar. Mais pour cela il faudrait l'exécuter.


Plutôt que de l'exécuter immédiatement, nous allons l'exécuter une seconde après l'exécution de notre fonction area(), ce qui devrait normalement retourner une erreur puisque myVar est censée être détruite une fois qu'area() a terminé son exécution.

function area() {

 

    var myVar = 1;

 

    function show() {

        alert(myVar);

    }

 

    setTimeout(show, 1000);

 

}

 

area();


Et, par miracle, cela fonctionne ! Vous n'êtes probablement pas surpris, cela fait déjà plusieurs fois que vous savez qu'il est possible d'accéder à une variable même après la disparition de l'espace dans lequel elle a été créée (ici, la fonction area()). Cependant, savez-vous pourquoi ?


Tout ce qui suit est très théorique et ne reflète pas forcément la véritable manière dont les variables sont gérées. Cependant, le principe expliqué vous éclairera tout de même sur ce concept avancé.


Vous souvenez-vous de la formulation « passer une variable par référence » ? Cela signifie que vous permettez que la variable soit accessible par un autre nom que celui d'origine. Ainsi, si vous avez une variable var1 et que vous la passez en référence à var2, alors var1 et var2 pointeront sur la même variable. Donc, en modifiant var1, cela affectera var2, et vice versa.


Tout cela nous amène à la constatation suivante : une variable peut posséder plusieurs références. Dans notre fonction area(), nous avons une première référence vers notre variable, car elle y est déclarée sous le nom myVar. Dans la fonction show(), nous avons une deuxième référence du même nom, myVar.


Quand une fonction termine son exécution, la référence vers la variable est détruite, rendant son accès impossible. C’est ce qui se produit avec notre fonction area(). La variable en elle-même continue à exister tant qu'il reste encore une référence qui est susceptible d'être utilisée. C'est aussi ce qui se produit avec la fonction show(). Puisque celle-ci possède une référence vers notre variable, cette dernière n'est pas détruite.


Ainsi, une variable peut très bien perdre dix de ses références, elle ne sera pas supprimée tant qu'il lui en restera au moins une. C'est ce qui explique que nous puissions accéder à la variable myVar dans la fonctionshow() malgré la fin de l'exécution de area().


Créé avec HelpNDoc Personal Edition: Générateur de documentation iPhone gratuit

Site à deux balles