Je hais les variables locales ActionScript

By | 23 octobre 2007

…parce que ça ne marche pas comme je m’y attends. Et donc ça me fait écrire des bugs!

Dans tous les autres languages que je connais (C, C++, C#, Java, Eiffel, …), la notion de scope est très stricte. Je m’attend donc à ce que la fonction suivant ne compile pas:

function test(a: Boolean): void {
if (a == true) {
var i: int = 10;
trace(i);
}
trace(i); // cette ligne ne devrait pas compiler!
}

Or ActionScript a une notion de scope un peu laxiste: dès qu’une variable est déclarée à l’intérieur d’une fonction – peu importe où – alors elle est accessible à l’intérieur, y compris avant sa déclaration! Regardez par exemple la fonction suivante:

public function test2(a: Boolean): void {
i = 5;
trace(i);
if (a == true) {
var i: int = 10;
trace(i);
}
}

La fonction compile et l’execution de test2(false) affiche « 5 ».
C’est fou non?

Alors quand on complique un peu les choses, forcement les bugs sortent du bois.

Quizz numéro 1: qu’affiche la fonction test3() lors de son execution?

public function test3(): void {
var functions: Array = new Array();
for (var i: int = 0; i < 5; i++) {
functions.push(function(): void {
trace(i);
});
}

for each (var fct: Function in functions) {
fct();
}
}

Oui, là devant, bien répondu!

5
5
5
5
5

Quand je vous dis que je hais les variables locales ActionScript!

Quizz numéro 2:Comment implementer la fonction 3 pour que les fonctions anonymes affichent leur index respectif?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *