Que va retourner cette fonction ?
(function() { 
if (false) {
 let f = { g() => 1 };
 }
 return typeof f;
 })()

Erreur dans la Fonction JavaScript

La question nous présente une fonction JavaScript auto-invoquée (aussi appelée fonction IIFE, pour Immediately Invoked Function Expression) qui contient une condition if basée sur la valeur booléenne false. Elle tente ensuite de retourner le type de f avec typeof.

Si nous essayons d'exécuter cette fonction, cela entraînera une erreur. Pourquoi ? Jetons un coup d'œil plus en détail.

Premièrement, la condition if (false) ne sera jamais exécutée car false est un littéral booléen, qui est toujours false par définition. Par conséquent, le corps de l'instruction if, y compris la déclaration de f, ne sera jamais exécuté. De ce fait, f est indéfini.

Cependant, l'erreur que nous obtenons n'est pas due au fait que f soit indéfini. Au lieu de cela, elle est due à une règle strictement respectée en JavaScript, qui stipule que les blocs if ne créent pas de portée. Par conséquent, toute tentative de référencement f en dehors du bloc if entraîne une erreur car f n'existe pas en dehors de ce bloc. La déclaration let ne peut pas aider ici car elle a une portée de bloc, ce qui signifie que le f dans typeof f est hors de portée et non défini.

Voici une approche alternative qui éviterait cette erreur :

(function() { 
 let f;
 if (false) {
  f = { g() => 1 };
 }
 return typeof f;
})()

Ici, f est déclaré au début de la fonction, ce qui signifie qu'il est défini dans toute la portée de cette fonction. Ensuite, il est potentiellement redéfini dans le bloc if. Puisque false ne sera jamais vrai, f reste undefined, donc typeof f sera "undefined".

Il est toujours préférable de déclarer toutes les variables en haut d'un bloc pour éviter toute ambiguïté ou erreur inattendue. Des pratiques comme celles-ci rendent le code plus lisible et plus facile à déboguer, ce qui est essentiel pour tout développeur JavaScript.

Related Questions

Trouvez-vous cela utile?