open

Javascript : Qu'est ce que le hoisting ?

#1 En Javascript on peut appeler une fonction avant de l'avoir déclarée open

En Javascript vous pouvez appeler une fonction avant de l'avoir déclarée. C'est assez surprenant mais c'est la réalité. Evidemment il y a une raison à cela. Vous avez déjà dû le constater mais je vais faire un exemple pour le vérifier.

Ci-dessous j'appelle la fonction afficheResultats alors qu'elle n'est pas encore déclarée et pourtant tout ce passe bien. Je déclare aussi une variable x que j'initialise à 0. Nous verrons plus loin pourquoi je fais ça.

Tester le code

#2 Expliquer ce fonctionnement par le hoisting open

Pour expliquer ce fonctionnement une explication existe : le hoisting (hissage en français). Le raisonnement consiste à dire que toutes les déclarations aussi bien de variables que de fonctions sont déplacées vers le haut de votre script.

Ainsi la fonction pourrait être appelée avant d'être déclarée puisque déplacée vers le haut par le moteur Javascript.

Il se trouve que c'est une explication qui est donnée disons pour "faire simple" mais qu'en réalité aucune instruction n'est déplacée.

#3 Ce qui se passe en réalité open

La vraie explication me parait beaucoup plus simple. En fait le moteur Javascript analyse le code en deux passes :

  1. Dans la première passe il s'intéresse aux déclarations.
  2. Dans la deuxième passe il va procéder à l'exécution.

Il me semble que l'on comprend facilement que dans ces conditions le moteur Javascript puisse exécuter une fonction lors d'une deuxième passe alors qu'il l'a identifiée dans une première. J'avoue que je m'interroge sur le bien-fondé d'avoir échafaudé ce concept de hoisting. Mais peut être que certaines choses m'échappent.

Alors c'est intéressant de regarder ce qui se passe au niveau de la déclaration de la variable let x=0. Dans la première passe le moteur va s'intéresser au let x et dans la deuxième passe il va s'intéresser au x=0. Donc une instruction de ce type est en quelque sorte exécutée en deux temps. Surprenant non !