Variables statiques en javascript

Une variable statique est une variable définie de manière locale dans une fonction mais qui ne perd pas sa valeur entre les appels successifs de cette fonction.

En javascript, il n'est pas possible de déclarer de variable statique ; le mot-clé static existe bien mais c'est un mot réservé qui n'est pas encore utilisé (en javascript 1.x).

Ayant réellement besoin de cette fonctionnalité, je me suis penché sur la question et après une recherche sur Google, je suis tombé sur l'article Object-Orientated JavaScript qui m'a mis sur la piste : l'idée est de "modifier" la fonction pour lui ajouter une propriété qui correspondra à notre variable statique. On utilise pour cela le mot-clé this qui correspond à la fonction elle-même.

L'exemple suivant correspond à un compteur simple :

function testStatic() {

    // Déclaration et initialisation d'une variable statique
    if ( typeof this.counter == 'undefined' ) this.counter = 0;

    // Affichage de la valeur de cette variable
    alert(this.counter);

    // Incrémentation de sa valeur
    this.counter++;

} // end of 'testStatic()'

// Exécution
testStatic(); // affiche '0';
testStatic(); // affiche '1';
// etc.

On peut aussi imaginer un appel de cette fonction à différents endroits de notre script principal mais devant gérer des compteurs multiples en fonction de paramètres ; on peut alors passer par un tableau qui permet de stocker nos différents compteurs :

function testStaticMultiple( name ) {

    // Déclaration d'une variable statique de type tableau
    if ( typeof this.counter == 'undefined' ) this.counter = [];
    if ( typeof this.counter[name] == 'undefined' ) this.counter[name] = 0;
    else this.counter[name]++;

    alert(this.counter[name]);

} // end of 'testStaticMultiple()'

// Execution
testStaticMultiple('test'); // affiche '0';
testStaticMultiple('test'); // affiche '1';
testStaticMultiple('val');  // affiche '0';
testStaticMultiple('test'); // affiche '2';
// etc.

Il est évident que la déclaration est plus lourde que le simple static $counter = 0; de PHP mais l'intérêt est réellement là dans le cas de certains scripts complexes. A vous de jouer !

Posté le jeudi 20 avril 2006 dans .

Commentaires

Ajouter un commentaire

Il n'est plus possible de réagir à cette entrée directement mais si vous pensez que votre intervention peut être intéressante, envoyez-moi votre commentaire, je l'ajouterai ici en votre nom.