Question

J'ai fait pas mal de recherches à ce sujet, mais il semble que les méthodes utilisées soient incohérentes et variées.

Voici quelques méthodes que j'ai utilisées par le passé:

/* 1: */  typeof myFunc === 'function'
/* 2: */  myFunc.constructor === Function
/* 3: */  myFunc instanceof Function

Dans le cadre de mes recherches, j’ai jeté un coup d’œil à la façon dont certaines bibliothèques bien connues ont accompli cela:

 /* jQuery 1.2.6: */  !!fn && typeof fn != "string" && !fn.nodeName && fn.constructor != Array && /^[\s[]?function/.test( fn + "" )
 /* jQuery 1.3b1: */  toString.call(obj) === "[object Function]"
/* Prototype 1.6: */  typeof object == "function"
      /* YUI 2.6: */  typeof o === 'function'

Je suis stupéfait par le nombre de méthodes différentes utilisées par les êtres humains. Un seul test acceptable a-t-il été convenu? Et je ne comprends absolument pas les intentions du rendu de jQuery 1.2.6, un peu OTT ...

Alors, ma question reste, quel est le meilleur * moyen de tester une fonction?

J'aimerais également avoir quelques informations sur certaines des méthodes ci-dessus, en particulier celles de jQuery 1.2.6. (Je peux voir ce qu'ils font, ça semble juste étrange)

[*] Par "meilleur", j'entends la méthode compatible multi-navigateurs la plus largement acceptée.

EDIT: Oui, je sais que cela a déjà été discuté, mais j'aimerais quand même discuter de la méthode la plus efficace. Pourquoi y a-t-il tant de méthodes différentes?

Les discussions sur les SO jusqu'à présent n’ont mentionné que le type d’opérateur (la plupart du temps) mais personne n’a fait allusion à l’efficacité des méthodes alternatives.

Était-ce utile?

La solution

Le meilleur moyen de vérifier si un objet est une fonction est typeof myFunc === 'fonction' . Si vous utilisez une bibliothèque, utilisez le test de fonction de cette bibliothèque: jQuery.isFunction (myFunc) .

Les éléments peuvent être déclarés à tort comme des fonctions lors de l'utilisation de typeof . C'est très rare, mais une bibliothèque est là pour éliminer ces incohérences. jQuery travaille sur ces problèmes:

  • Les rapports Firefox fonctionnent avec typeof document.createElement ("objet")
  • Les rapports Safari fonctionnent avec typeof document.body.childNodes
  • Les anciennes versions de Firefox signalaient les expressions régulières sous forme de fonctions (ce n'est pas le cas dans la version 3.0).
  • Certaines fonctions globales intégrées dans IE ( alert ) et certaines méthodes de nœud ( getAttribute ) sont signalées comme étant du type "objet".

L'utilisation de instanceof plutôt que typeof en contourne certaines. Par exemple, document.createElement ("objet") instance de Fonction est false dans Firefox.

Vous pouvez afficher la naissance de la première méthode dans les commentaires de le ticket d'origine (# 3618) . La nouvelle méthode provient de changeset 5947 et semble avoir été inventée par Resig pour résoudre Fuites de mémoire dans Internet Explorer . C'est probablement plus lent, mais plus petit et plus propre.

Il n’ya pas beaucoup de différence entre == et === ici, mais l’évaluation stricte est un peu plus rapide et donc préférable.

Autres conseils

John Resig, le développeur de jQuery, semble avoir fait des choix bizarres dans les éléments internes de jQuery.

toString.call(obj) === "[object Function]"

semble assez soigné, mais je ne peux imaginer une situation où ce qui est dit ci-dessus serait vrai, où l'approche simple typeof échouerait, mais il sait peut-être quelque chose que le reste de l'utilisation ne fait pas.

typeof o === "function"

J'irais avec ce dernier, car il est plus clair, à moins que vous ne disposiez de preuves solides que cela ne fonctionnerait pas.

Pourquoi utiliser une égalité stricte sur typeof puisque les deux opérandes sont des chaînes? Je néglige un problème?

Quoi qu'il en soit, je choisirais le type le plus simple, qui semble être fait pour cela et qui est lisible. instanceof est également lisible, mais il semble insister davantage sur le fait qu'une fonction est un objet, ce qui pourrait ne pas être pertinent pour le problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top