2009-12-10 8 views
4

Supposons que j'ai une simple fonction définie qui ne fait rien: function fn() { }Javascript toString bizarrerie

Maintenant, quand je lance toString(fn) je reçois "[object Object]". Quand je cours toString.call(fn) j'obtiens "[fonction d'objet]". Est-ce que quelqu'un sait pourquoi je reçois un type plus spécifique lors de l'utilisation de la méthode call?

EDIT: Ce comportement est affiché dans FireFox exécuté via la console FireBug. Les deux toString.constructor et toString.call.constructor donnent "Function()".

+0

Détails s'il vous plaît. Appelez-vous cela dans un interpréteur JavaScript? Laquelle? Rhinocéros? jrunscript? quelle version? –

+0

Fait intéressant, autant que je sache, toString est une méthode définie sur le prototype d'objet, et non une fonction intégrée. Donc, la question est de savoir à qui vous appelez toString, et quel argument reçoit-il? –

+0

J'ai exécuté ce code via la console Firebug 1.4.5. La raison pour laquelle j'ai été curieux est que j'ai vu toString.call utilisé comme ça dans le code source de jQuery et j'ai commencé à expérimenter. J'ai couru le code EXACTEMENT comme il est montré dans la question (donc non "someobject.toString"). –

Répondre

11

toString n'accepte pas les arguments, donc toString(fn) est identique à toString(), ce qui renvoie un objet global implicite, converti en chaîne. toString.call(fn) appelle global.toString passant objet de la fonction comme ceci, mais puisque global.toString est une méthode de l'objet, le résultat est différent de Function.toString.

+0

+1 pour révéler "l'objet global implicite"! –

+0

Merci aussi de m'avoir signalé la faille évidente de mon expérience: j'ai oublié que je ne passais pas fn comme paramètre dans l'appel mais comme contexte! Maintenant tout cela a un sens total. –