vendredi 29 octobre 2010

Piège JavaScript no. 7

J'ai aussi échoué la deuxième question du quiz JavaScript avancé. La question était la suivante : dans l'exemple suivant, qu'affichera typeof ?
var f = function g(){ return 23; };
typeof g();
Choix de réponse :
  • number
  • undefined
  • function
  • error
Logiquement, je m'étais dit que la fonction g() était bel et bien définie et qu'elle était simplement assignée à f. J'ai donc répondu "function" sachant, à cause du piège #6, que typeof sur une fonction retourne "function".

Erreur. Parce que la fonction est assignée à la variable, g est contenu dans f mais ne semble pas reconnu dans la portée globale :
console.log( f ); // g()
console.log( f() ); // 23
console.log( g() ); // g is not defined
Sauf si on procédait ainsi :
function g(){ return 23; }
console.log( typeof g ); // function
console.log( typeof g() ); // number
Ici, typeof g() retournerait un nombre mais dans le contexte du piège, g() n'est pas défini. La réponse undefined semble alors évidente. Faux.
console.log( g() == undefined ? true : false ); // g is not defined
Autrement dit, "is not defined" lancé par Firebug n'équivaut pas à "undefined". Ce serait indéfini dans le cas où une variable ne serait pas initialisée (si la fonction g() n'est pas assignée à f).
var f;
console.log(f); // undefined
La bonne réponse était : typeof g() provoque une erreur.

Aucun commentaire:

Publier un commentaire