Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Sessions intra-entreprises sur demande : contact[at]mokatech.net.
Inscrivez-vous vite !

JavaScript Quiz #2

Qu'insère le bloc JavaScript suivant dans la page HTML ?

  1. var x = 9;
  2. function test() {
  3. document.write(x);
  4. document.write("<br/>");
  5.  
  6. var x = 10;
  7.  
  8. document.write(x);
  9. document.write("<br/>");
  10. }
  11. test();
  12. document.write(x);

Réponse :

undefined
10
9

Étonnant, non ?

Explication :

Le 9 final n'est pas très surprenant : la variable locale x déclarée dans test() masque la variable globale x. Nous avons donc deux variables x qui vivent leur vie indépendamment, et il est logique que la variable globale x conserve sa valeur tout au long de ce quiz, puisqu'on ne la modifie jamais après son initialisation.

Du coup, le 10 en second est tout aussi logique : c'est la valeur de la variable locale que l'on affiche ici.

Mais pourquoi le undefined ? Pourquoi pas 9 ?

En fait, JavaScript ne gère pas la portée des variables locales comme en C, en C++ ou en Java.

En particulier, lorsqu'une variable locale est déclarée avec var, elle existe dans toute la fonction dans laquelle elle est déclarée. Peu importe qu'elle soit déclarée au milieu du code : elle existe dès le début. Donc elle masque la variable globale dès le début de la fonction.

Par contre, JavaScript ne fait pas de différence entre initialisation et affectation d'une variable -- contrairement à C++, par exemple. Pour JavaScript, une initialisation n'est rien d'autre qu'une instruction d'affectation. Et cette instruction est exécutée là où le développeur l'a placée. Le code de la fonction test() ci-dessus est donc strictement équivalent à celui ci-dessous :

  1. function test() {
  2. var x;
  3.  
  4. document.write(x);
  5. document.write("<br/>");
  6.  
  7. x = 10;
  8.  
  9. document.write(x);
  10. document.write("<br/>");
  11. }

Du coup, on est en droit de se demander quelle valeur x peut avoir entre sa déclaration et sa première affectation. En fait, JavaScript initialise systématiquement, et de manière automatique, toutes les variables à la valeur spéciale undefined au moment où elles sont déclarées. Et c'est bien cette valeur que l'on obtient dans le résultat du quiz !


Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.