795 votes

Comment vérifier si une fonction existe en JavaScript ?

Mon code est le suivant

function getID( swfID ){
     if(navigator.appName.indexOf("Microsoft") != -1){
          me = window[swfID];
     }else{
          me = document[swfID];
     }
}

function js_to_as( str ){
     me.onChange(str);
}

Cependant, parfois, mon onChange ne se charge pas. Les erreurs de Firebug avec

me.onChange n'est pas une fonction

Je veux que la dégradation soit gracieuse car ce n'est pas la fonctionnalité la plus importante de mon programme. typeof donne la même erreur.

Des suggestions sur la façon de s'assurer qu'il existe et ensuite seulement d'exécuter onChange ?

(Aucune des méthodes ci-dessous, sauf try catch one, ne fonctionne)

2 votes

@SteveChambers Je l'ai fait. Merci de me le rappeler.

0 votes

0 votes

Attraper l'exception. vérifier ma réponse

1608voto

Andrew Hare Points 159332

Essayez quelque chose comme ça :

if (typeof me.onChange !== "undefined") { 
    // safe to use the function
}

ou mieux encore (selon le commentaire de UpTheCreek upvoted)

if (typeof me.onChange === "function") { 
    // safe to use the function
}

300 votes

\=== "fonction" serait préférable à != "indéfini".

3 votes

@James, parce que cette déclaration jette en fait un undefined dans le JavaScript. Je l'ai essayé.

11 votes

@UpTheCreek, ce serait un peu dangereux comme solution générale puisque les anciennes versions d'IE traitent certaines fonctions comme des objets, par exemple. typeof window.alert === 'object' .

166voto

Misha Nasledov Points 466

J'ai eu ce problème.

if (obj && typeof obj === 'function') { ... }

continuait à lancer une erreur de référence si obj était indéfini.

En fin de compte, j'ai fait ce qui suit :

if (typeof obj !== 'undefined' && typeof obj === 'function') { ... }

Un collègue m'a fait remarquer que le fait de vérifier si c'est !== 'undefined' et ensuite === 'function' est bien sûr redondant.

Plus simple :

if (typeof obj === 'function') { ... }

Beaucoup plus propre et fonctionne très bien.

1 votes

Quelqu'un a une idée de la raison pour laquelle le premier extrait de code jette ReferenceError ? Cela me semble illogique.

0 votes

@saidfagan Voir la définition de ReferenceError developer.mozilla.org/fr/US/docs/Web/JavaScript/Référence/

3 votes

Un motif pour lequel typeof obj == 'function' serait insuffisant ? ;-) Rappel : l'opérateur de test d'égalité stricte n'a de sens que lorsque l'opérande statique est vide ou nul ou 0 ou soumis à un amalgame de type cast comme celui-ci.

46voto

bernie Points 44206

Edit : Je ne prétends pas connaître la ou les raisons pour lesquelles cette réponse est acceptée. Veuillez plutôt utiliser la solution proposée dans la réponse d'Andrew Hare : http://stackoverflow.com/a/1042154/42346


Voici une façon de gérer ce genre de situation :

function js_to_as( str ){
    try {
        me.onChange(str);
    }
    catch(err) {
        // Handle error(s) here
    }
}

21voto

dhulihan Points 3321

Si vous utilisez eval pour convertir une chaîne en fonction, et que vous voulez vérifier si cette méthode evalée existe, vous voudrez utiliser typeof et votre chaîne de fonction dans un eval :

var functionString = "nonexsitantFunction"
eval("typeof " + functionString) // returns "undefined" or "function"

Ne faites pas l'inverse et essayez un typeof en eval . Si vous le faites, une ReferenceError sera lancée :

var functionString = "nonexsitantFunction"
typeof(eval(functionString)) // returns ReferenceError: [function] is not defined

2 votes

C'est peut-être diabolique, mais c'est très utile lorsque le nom de la fonction se trouve dans une variable.

9 votes

Vous pouvez le faire sans évaluation. Exemple : var a = 'alert'; window[a]('it works');

15voto

Mat Carlson Points 364

Essayez typeof -- Cherchez 'undefined' pour dire qu'il n'existe pas, 'function' pour une fonction. JSFiddle pour ce code

function thisishere() {
    return false;
}
alert("thisishere() is a " + typeof thisishere);
alert("thisisnthere() is " + typeof thisisnthere);

Ou comme un "si" :

if (typeof thisishere === 'function') {
    // function exists
}

Ou avec une valeur de retour, sur une seule ligne :

var exists = (typeof thisishere === 'function') ? "Value if true" : "Value if false";
var exists = (typeof thisishere === 'function') // Returns true or false

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X