Comment savoir si une fonction JavaScript est définie

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 donne un

Le rappel n'est pas une fonction

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

258
demandé sur Peter Mortensen 2008-09-17 21:50:53

19 réponses

typeof callback === "function"
401
répondu Tom Ritter 2016-09-07 13:14:51

Toutes les réponses utilisez une chaîne littérale, que je préfère ne pas avoir dans mon code si possible - ce n'est pas (et de sens sémantique, pour démarrer):

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

Personnellement, j'essaie de réduire le nombre de chaînes qui traînent dans mon code...


Aussi, bien que je sois conscient que typeof est un opérateur et non une fonction, il y a peu de mal à utiliser la syntaxe qui le fait apparaître comme ce dernier.

223
répondu Jason Bunting 2015-11-10 19:58:07
if (callback && typeof(callback) == "function")

Notez que le rappel (par lui-même) évalue à false si elle est undefined, null, 0, ou false. La comparaison avec null est trop spécifique.

13
répondu Robin like the bird 2012-07-03 21:50:36

Nouveau sur JavaScript Je ne suis pas sûr si le comportement a changé mais la solution donnée par Jason Bunting (il y a 6 ans) ne fonctionnera pas si possibleFunction n'est pas défini.

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

Cela lancera une erreur ReferenceError: possibleFunction is not defined lorsque le moteur tentera de résoudre le symbole possibleFunction (comme mentionné dans les commentaires à la réponse de Jason)

Pour éviter ce comportement, vous pouvez passer le nom de la fonction que vous voulez vérifier s'il existe. Donc

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

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

6
répondu NectarSoft 2014-04-29 16:47:26

Ces méthodes pour dire 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:

function isFunctionDefined(functionName) {
    if(eval("typeof(" + functionName + ") == typeof(Function)")) {
        return true;
    }
}

if (isFunctionDefined('myFunction')) {
    myFunction(foo);
}
5
répondu patriciorocca 2010-09-21 16:52:52

Essayez:

if (typeof(callback) == 'function')
5
répondu bdukes 2017-12-08 18:12:08
function something_cool(text, callback){
    alert(text);
    if(typeof(callback)=='function'){ 
        callback(); 
    };
}
3
répondu ConroyP 2008-09-17 17:59:42
if ('function' === typeof callback) ...
3
répondu Andrew Hedges 2008-09-17 22:50:31
typeof(callback) == "function"
3
répondu dashtinejad 2017-01-10 09:57:20

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 de l'idiomatique, mais cela fonctionne pour tous les cas.

Dans les nouveaux moteurs JavaScript, un finally peut être utilisé à la place.

3
répondu Quentin Engles 2017-12-11 13:27:31

Essayez ceci:

callback instanceof Function
2
répondu eWolf 2012-07-25 05:30:06

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

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

C'est juste mon Indice, réponse D'indice: >

2
répondu VentyCZ 2016-04-16 21:15:38

Essayez:

if (!(typeof(callback)=='undefined')) {...}
2
répondu Brian 2017-12-08 18:12:19

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

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

if(typeof jQuery.fn.datepicker !== "undefined")
1
répondu miguelmpn 2015-06-04 14:51:51

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

_.isFunction(callback);
0
répondu Venkat Sudheer Reddy Aedama 2015-01-28 21:01:46

Si le callback() que vous appelez pas seulement pour une fois dans une fonction, vous pouvez initialiser l'argument pour la réutilisation:

callback = (typeof callback === "function") ? callback : function(){};

Par exemple:

function something_cool(text, callback) {
    // Initialize arguments
    callback = (typeof callback === "function") ? callback : function(){};

    alert(text);

    if (text==='waitAnotherAJAX') {
        anotherAJAX(callback);
    } else {
        callback();
    }
}

La limitation est qu'il exécutera toujours l'argument de rappel bien qu'il ne soit pas défini.

0
répondu Nick Tsai 2017-10-14 10:02:39

Pour les fonctions globales, vous pouvez utiliser celle-ci au lieu de eval suggéré dans l'une des réponses.

var global = (function (){
    return this;
})();

if (typeof(global.f) != "function")
    global.f = function f1_shim (){
        // commonly used by polyfill libs
    };

Vous pouvez également utiliser global.f instanceof Function, mais afaik. la valeur de Function sera différente dans différentes images, de sorte qu'elle ne fonctionnera correctement qu'avec une application à une seule image. C'est pourquoi nous utilisons généralement typeof à la place. Notez que dans certains environnements il peut y avoir des anomalies avec typeof f aussi, par exemple par MSIE 6-8 certaines des fonctions par exemple alert avaient le type "objet".

Locales fonctions vous pouvez utiliser celui de la réponse acceptée. Vous pouvez également tester si la fonction est locale ou globale.

if (typeof(f) == "function")
    if (global.f === f)
        console.log("f is a global function");
    else
        console.log("f is a local function");

Pour répondre à la question, l'exemple de code fonctionne pour moi sans erreur dans les derniers navigateurs, donc je ne suis pas sûr de quel était le problème:

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

Note: j'utiliserais callback !== undefined au lieu de callback != null, mais ils font presque la même chose.

0
répondu inf3rno 2017-10-14 10:31:45

La plupart sinon toutes les réponses précédentes ont des effets secondaires pour invoquer la fonction

Voici les meilleures pratiques

Vous avez une fonction

function myFunction() {
        var x=1;
    }
moyen direct de tester pour cela

//direct way
        if( (typeof window.myFunction)=='function')
            alert('myFunction is function')
        else
            alert('myFunction is not defined');
en utilisant une chaîne de sorte que vous ne pouvez avoir qu'un seul endroit pour définir le nom de la fonction

//byString
        var strFunctionName='myFunction'
        if( (typeof window[strFunctionName])=='function')
            alert(s+' is function');
        else
            alert(s+' is not defined');
0
répondu TexWiller 2018-01-20 06:46:08

Solution à une ligne:

function something_cool(text, callback){
    callback && callback();
}
-1
répondu Samir Alajmovic 2016-01-18 20:08:50