Hoisting

Le Hoisting est un concept propre au moteur Javascript sur la manière d’exécuter les scripts. Cela permet à Javascript de répertorier les variables ou les fonctions qui seront utilisées AVANT leur utilisation dans un script.

Prenons un exemple pour comprendre :

1 let result = 1;
2
3 console.log(addOne(3)); // Retourne 4
4 console.log(result); // Retourne 4
5
6 function addOne(numToAdd) {
7  result = result + numToAdd;
8  return result;
9 }

Ici, nous appelons addOne à la ligne 3 alors que nous l’avons déclaré plus bas, de la ligne 6 à 9, nous devrions avoir un message d’erreur. Mais grâce au mécanisme de Hoisting, Javascript a été capable de parcourir notre fichier avant qu’il ne s’execute et a mémorisé toutes les déclarations de fonctions.

Mais il faut garder à l’esprit que cela n’est valable que dans le cadre d’une déclaration de fonction avec le mot clé function.

Si nous avions une fonction anonyme stockée dans une variable comme suit :

1 let result = 1;
2
3 console.log(addOne(3)); // Retourne 4
4 console.log(result); // Retourne 4
5
6 const addOne = function (numToAdd) {
7  result = result + numToAdd;
8  return result;
9 }

La variable addOne sera bien entendu référencée par le mécanisme du Hoisting mais il ne sera pas possible d’appeler la fonction associée.

Soyez donc vigilant si vous utilisez cette syntaxe.

Pour comprendre ce que fait le hoisting nous allons proposer ce script simple :

 1let var1 = 100;
 2let var2 = increment(var1);
 3let var3 = decrement(var2);
 4
 5function increment(value) {
 6  return value++;
 7}
 8
 9const decrement = function(value) {
10  return value--;
11}
Le même script réorganisé par le moteur Javascript : Hoisting
 1function increment(value) {
 2  return value++;
 3}
 4
 5let var1;
 6let var2;
 7let var3;
 8const decrement;
 9
10var1 = 100;
11var2 = increment(var1);
12var3 = decrement(var2);
13decrement = function(value) {
14  return value--;
15}

La déclaration de la fonction increment est bien déplacée, levée au haut du script, car elle a été déclarée avec le mot clé function.

Les variables var1, var2, var3 viennent ensuite, mais aucune valeur ne leur a été affecté, elles sont définies pour le moment comme undefined.

La fonction decrement est considérée comme étant une variable de par sa syntaxe déclarative.

A retenir

Le moteur de Javascript, fait un traitement du script avant de l”exécuter. Il va bouger les déclarations de variables tout en haut du script, ainsi que les déclarations de fonctions.

Puis les affectations des valeurs seront faites uniquement lors de l’execution.