Comment savoir 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 ça me fait
le rappel n'est pas une fonction
erreur lorsque le rappel n'est pas défini.
javascript
reflection
Aaron Lee
la source
la source
Toutes les réponses actuelles utilisent une chaîne littérale, que je préfère ne pas avoir dans mon code si possible - cela ne fonctionne pas (et fournit une signification sémantique précieuse, pour démarrer):
Personnellement, j'essaie de réduire le nombre de chaînes qui traînent dans mon code ...
De plus, bien que je sache qu'il
typeof
s'agit d'un opérateur et non d'une fonction, il y a peu de mal à utiliser la syntaxe qui la fait apparaître comme cette dernière.la source
isFunction(not_defined))
oùnot_defined
est le nom de la fonction qui n'est pas définie et FireBug est retournénot_defined is not defined
ce qui est correct mais votre fonction devrait retourner false et ne pas générer d'erreur ...not_defined
afin de transmettre sa valeur àisFunction()
et ne parvient pas à le résoudre. Rien ne peut être fait à la définition deisFunction()
pour résoudre ce problème.isFunction
et faites juste(typeof no_function == typeof Function)
.typeof(Function())
parce que Function est une fonction; mais il en va de même pour Array, Object et d'autres prototypes intégrés (faute d'un meilleur terme). Si vous recherchiez un tableau, vous ne l'utiliseriez pastypeof(array) === typeof(Array)
par exemple; vous utiliserieztypeof(array) === typeof(Array())
parce que vous avez réellement besoin d'évaluer la fonction si vous êtes prudent et cohérent.Notez que le rappel (par lui - même) Evalue à
false
si elle estundefined
,null
,0
, oufalse
. La comparaison avecnull
est trop spécifique.la source
callback
lui - même est évalué à une valeur "false-y", son typeof ne peut jamais être "function".Ces méthodes pour savoir si une fonction est implémentée échouent également si la variable n'est pas définie, nous utilisons donc quelque chose de plus puissant qui prend en charge la réception d'une chaîne:
la source
typeof window.doesthisexist
place dedoesthisexist
. Cependant, utiliser eval (qui: est mauvais) comme indiqué ne fonctionnera qu'avec les fonctions nommées - cela ne fonctionnerait pas avec le cas d'utilisation de la question.Nouveau sur JavaScript Je ne sais pas si le comportement a changé mais la solution proposée par Jason Bunting (il y a 6 ans) ne fonctionnera pas si possible. La fonction n'est pas définie.
Cela jettera un
ReferenceError: possibleFunction is not defined
erreur lorsque le moteur tentera de résoudre le symbole possibleFunction (comme mentionné dans les commentaires de la réponse de Jason)Pour éviter ce comportement, vous ne pouvez transmettre que le nom de la fonction que vous souhaitez vérifier si elle existe. Alors
Cela définit une variable comme étant la fonction que vous souhaitez vérifier ou l'objet vide si elle n'est pas définie et évite ainsi les problèmes mentionnés ci-dessus.
la source
Essayer:
la source
la source
la source
if(typeof Function === typeof callback)...
? :)typeof
renvoie quelque chose de différent plus tard (peut-être "Function" au lieu de "function"), en raison d'une implémentation nouvelle / différente de JavaScript - il semble qu'il serait moins probable que une implémentation nouvelle / différente briserait letypeof Function === typeof callback
contrôle car elle devrait être la même au niveau sémantique.la source
Je pourrais faire
Je sais qu'il y a une réponse acceptée, mais personne ne l'a suggérée. Je ne sais pas vraiment si cela correspond à la description d'idiomatique, mais cela fonctionne dans tous les cas.
Dans les moteurs JavaScript plus récents, a
finally
peut être utilisé à la place.la source
typeof callback
toute façon.accepted_types.indexOf(typeof value) !== -1
si c'est dans une gamme de types. Dans cette situation, les exceptions seraient à mon avis prohibitives.Essaye ça:
la source
Si vous regardez la source de la bibliothèque @Venkat Sudheer Reddy Aedama mentionnée, underscorejs, vous pouvez voir ceci:
Ceci est juste mon indice, réponse indice:>
la source
Essayer:
la source
Si vous utilisez http://underscorejs.org , vous avez: http://underscorejs.org/#isFunction
la source
Je cherchais comment vérifier si une fonction jQuery était définie et je ne l'ai pas trouvée facilement.
Peut-être en aurais-je besoin;)
la source
type0f($.datepicker) !== undefiled
sera le casobject
Si
callback()
vous n'appelez pas juste une fois dans une fonction, vous pouvez initialiser l'argument à réutiliser:Par exemple:
La limitation est qu'il exécutera toujours l'argument de rappel même s'il n'est pas défini.
la source
Pour les fonctions globales, vous pouvez utiliser celle-ci au lieu de
eval
suggérée dans l'une des réponses.Vous pouvez également l'utiliser
global.f instanceof Function
, mais afaik. la valeur deFunction
sera différente dans différents cadres, donc cela ne fonctionnera correctement qu'avec une seule application de cadre. C'est pourquoi nous utilisons habituellement à latypeof
place. Notez que dans certains environnements, il peut y avoir des anomalies avectypeof f
, par exemple par MSIE 6-8 certaines des fonctions par exemplealert
avaient le type "objet".Par fonctions locales, vous pouvez utiliser celle de la réponse acceptée. Vous pouvez également tester si la fonction est locale ou globale.
Pour répondre à la question, l'exemple de code fonctionne pour moi sans erreur dans les derniers navigateurs, donc je ne sais pas quel était le problème:
Remarque: j'utiliserais
callback !== undefined
au lieu decallback != null
, mais ils font presque la même chose.la source
La plupart des réponses précédentes, sinon toutes, ont des effets secondaires pour invoquer la fonction
ici meilleure pratique
tu as une fonction
la source
Si vous souhaitez redéfinir des fonctions, il est préférable d'utiliser des variables de fonction, qui sont définies dans leur ordre d'occurrence, car les fonctions sont définies globalement, peu importe où elles se produisent.
Exemple de création d'une nouvelle fonction qui appelle une fonction précédente du même nom:
la source
Cela a fonctionné pour moi
la source
Solution en une ligne:
la source