Question

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 un

  

le rappel n'est pas une fonction

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

Était-ce utile?

La solution

typeof callback === "function"

Autres conseils

Toutes les réponses actuelles utilisent une chaîne littérale, que je préfère ne pas avoir dans mon code si possible - ce n'est pas le cas (et fournit un sens sémantique précieux, 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 ...

De plus, bien que je sache que typeof est un opérateur et non une fonction, il y a peu de mal à utiliser une syntaxe qui la fait apparaître comme cette dernière.

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

Notez que le rappel (par lui-même) a pour résultat false s'il est indéfini , null , 0 , ou false . La comparaison avec null est trop spécifique.

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:

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

if (isFunctionDefined('myFunction')) {
    myFunction(foo);
}

Nouveauté 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.

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

Cela générera une erreur ReferenceError: possibleFunction n'est pas définie lorsque le moteur tente de résoudre le symbole possibleFunction (comme indiqué dans les commentaires de la réponse de Jason)

Pour éviter ce problème, vous ne pouvez que transmettre le nom de la fonction à vérifier, le cas échéant. Donc

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

Ceci définit une variable comme étant la fonction que vous voulez vérifier ou l’objet vide si elle n’est pas définie, ce qui évite les problèmes mentionnés ci-dessus.

Essayez:

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

je pourrais faire

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

Je sais que la réponse est acceptée, mais personne ne l’a suggéré. Je ne sais pas vraiment si cela correspond à la description de idiomatique, mais cela fonctionne dans tous les cas.

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

if ('function' === typeof callback) ...
typeof(callback) == "function"
function something_cool(text, callback){
    alert(text);
    if(typeof(callback)=='function'){ 
        callback(); 
    };
}

Essayez ceci:

callback instanceof Function

Si vous consultez la source de la bibliothèque @Venkat Sudheer Reddy Aedama, soulignez, souligne, vous pouvez voir ceci:

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

Ceci est juste mon indice, astuce réponse: >

Essayez:

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

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

_.isFunction(callback);

Je cherchais comment vérifier si une fonction jQuery était définie et je ne la trouvais pas facilement.

Peut-être en aurait-il besoin;)

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

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

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 même s’il n’est pas défini.

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 autant que vous le souhaitez. la valeur de la Fonction sera différente dans différents cadres, de sorte que cela ne fonctionnera correctement qu'avec une application à un seul cadre. C'est pourquoi nous utilisons habituellement typeof . Notez que dans certains environnements, il peut également y avoir des anomalies avec typeof f , par exemple. dans MSIE 6-8, certaines des fonctions, par exemple, alert avaient " objet " type.

Par les fonctions locales, vous pouvez utiliser celui de la réponse acceptée. Vous pouvez également vérifier 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. Je ne sais donc pas quel était le problème.

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

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

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

ici les meilleures pratiques

vous avez la fonction

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

//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 puissiez 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');

Solution sur une ligne:

function something_cool(text, callback){
    callback && callback();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top