Comment savoir si une fonction Javascript est définie

Comment dites-vous si une fonction en JavaScript est définie?

Je veux faire quelque chose comme ça

function something_cool(text, callback) { alert(text); if( callback != null ) callback(); } 

Mais il me fait un

Le rappel n'est pas une fonction

Erreur lorsque le rappel n'est pas défini.

 typeof callback === "function" 

Toutes les réponses actuelles utilisent une chaîne littérale, ce que je préfère ne pas avoir dans mon code, si possible – ce n'est pas (et fournit un sens sémantique précieux pour lancer):

 function isFunction(possibleFunction) { return typeof(possibleFunction) === typeof(Function); } 

Personnellement, j'essaie de réduire le nombre de chaînes suspendues dans mon code …


En outre, alors que je sais que typeof est un opérateur et non une fonction, il y a peu de mal à utiliser la syntaxe qui fait apparaître cette dernière.

 if (callback && typeof(callback) == "function") 

Notez que le rappel (par lui-même) évalue à false s'il est undefined , null , 0 ou false . Comparer à null est trop spécifique.

Nouveau sur JavaScript Je ne sais pas si le comportement a changé, mais la solution donnée par Jason Bunting (il y a 6 ans) ne fonctionnera pas si possible. La fonction n'est pas définie.

 function isFunction(possibleFunction) { return (typeof(possibleFunction) == typeof(Function)); } 

Cela jettera un ReferenceError: possibleFunction is not defined erreur ReferenceError: possibleFunction is not defined car le moteur essaie de résoudre le symbole possibleFunction (comme mentionné dans les commentaires à la réponse de Jason)

Pour éviter ce comportement, vous ne pouvez passer le nom de la fonction que vous souhaitez vérifier si elle existe. Alors

 var possibleFunction = possibleFunction || {}; if (!isFunction(possibleFunction)) return false; 

Cela définit une variable comme étant la fonction que vous voulez vérifier ou l'objet vide si elle n'est pas définie et évite ainsi les problèmes mentionnés ci-dessus.

essayer

 if (typeof(callback) == 'function') 

Ces méthodes pour indiquer si une fonction est implémentée échouent également si la variable n'est pas définie, donc nous utilisons quelque chose de plus puissant qui prend en charge la réception d'une chaîne:

 function isFunctionDefined(functionName) { if(eval("typeof(" + functionName + ") == typeof(Function)")) { return true; } } if (isFunctionDefined('myFunction')) { myFunction(foo); } 
 function something_cool(text, callback){ alert(text); if(typeof(callback)=='function'){ callback(); }; } 
 if ('function' === typeof callback) ... 

Essaye ça:

 callback instanceof Function 
 typeof(callback) == "function" 

essayer:

 if (!(typeof(callback)=='undefined')) {...} 

Si vous regardez la source de la bibliothèque @Venkat Sudheer Reddy Aedama mentionnée, underscorejs, vous pouvez voir ceci:

 _.isFunction = function(obj) { return typeof obj == 'function' || false; }; 

C'est juste ma réponse CONSEIL, CONSEIL:>

je pourrais faire

 try{ callback(); catch(e){}; 

Je sais qu'il y a une réponse acceptée, mais personne ne l'a suggéré. Je ne suis pas vraiment sûr si cela correspond à la description idiomatique, mais ça marche pour tous les cas.

Dans les nouveaux moteurs js, on peut finally utiliser à la place.

Je cherchais comment vérifier si une fonction jQuery était définie et je ne l'ai pas trouvé facilement.

Peut-être pourrait-il en avoir besoin;)

 if(typeof jQuery.fn.datepicker !== "undefined") 

Si vous utilisez http://underscorejs.org , vous avez: http://underscorejs.org/#isFunction

 _.isFunction(callback); 

Solution en ligne:

 function something_cool(text, callback){ callback && callback(); }