web-dev-qa-db-fra.com

Comment vérifier si la fonction existe en JavaScript?

J'ai suivi ce guide pour créer un nouveau JS en communication flash. 

Mon code est

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, ma onChange ne se charge pas. Erreurs de bug avec

me.onChange n'est pas une fonction

Je veux me dégrader gracieusement parce que ce n'est pas la fonctionnalité la plus importante de mon programme. typeof donne la même erreur.

Des suggestions sur la manière de s’assurer qu’il existe et de n’exécuter que onChange?

(Aucune des méthodes ci-dessous, sauf essayer d'attraper un travail)

418
Alec Smart

Essayez quelque chose comme ça:

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

ou mieux encore (selon le commentaire voté par UpTheCreek)

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

J'ai eu ce problème.

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

gardé jetant une erreur de référence si obj était indéfini.

Finalement, j'ai fait ce qui suit:

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

Un collègue m'a fait remarquer que vérifier s'il s'agit bien de !== 'undefined' puis de === 'function' est bien sûr redondant.

Plus simple:

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

Beaucoup plus propre et fonctionne très bien.

93
Misha Nasledov

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

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

N'inversez pas ceci et essayez un typeof on eval . Si vous faites une ReferenceError sera levée:

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

Que diriez-vous:

if('functionName' in Obj){
    //code
}

par exemple. 

var color1 = new String("green");
"length" in color1 // returns true
"indexOf" in color1 // returns true
"blablabla" in color1 // returns false

ou comme pour votre cas:

if('onChange' in me){
    //code
}

Voir Documents MDN .

8
Nasser Al-Wohaibi

Je n'ai pas vu ceci suggéré: me.onChange && me.onChange (str);

Fondamentalement, si me.onChange n'est pas défini (ce qui sera le cas s'il n'a pas été initié), il n'exécutera pas la dernière partie. Si me.onChange est une fonction, il m'exécutera.onChange (str).

Vous pouvez même aller plus loin et faire:

me && me.onChange && me.onChange(str);

dans le cas où moi est async aussi.

7
Samir Alajmovic

Essayez typeof - Recherchez 'undefined' pour indiquer 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 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
6
Mat Carlson

Je vais faire un pas de plus pour m'assurer que la propriété est bien une fonction

function js_to_as( str ){
     if (me && me.onChange && typeof me.onChange === 'function') {
         me.onChange(str);
     }
}
4
Alex
//Simple function that will tell if the function is defined or not
function is_function(func) {
    return typeof window[func] !== 'undefined' && $.isFunction(window[func]);
}

//usage

if (is_function("myFunction") {
        alert("myFunction defined");
    } else {
        alert("myFunction not defined");
    }
3
Muhammad Tahir

J'aime utiliser cette méthode:

function isFunction(functionToCheck) {
  var getType = {};
  return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
}

Usage:

if ( isFunction(me.onChange) ) {
    me.onChange(str); // call the function with params
}
3
David Douglas

Pour moi le moyen le plus simple:

function func_exists(fname)
{
  return (typeof window[fname] === 'function');
}
3
Tu4n3r

La bibliothèque Underscore.js le définit dans la méthode isFunction en tant que telle (ce que les commentaires suggèrent peut résoudre certains problèmes de navigateur).

typeof obj == 'function' || false

http://underscorejs.org/docs/underscore.html#section-143

3
PandaWood

Ce code jQuery simple devrait faire l'affaire:

if (jQuery.isFunction(functionName)) {
    functionName();
}
2
mainak chakraborty

Je suspecterais que me ne soit pas correctement assigné en charge.

Déplacer l'appel get_ID dans l'événement onclick devrait s'en charger.

Évidemment, vous pouvez continuer à piéger, comme mentionné précédemment:

function js_to_as( str) {
  var me = get_ID('jsExample');
  if (me && me.onChange) {
    me.onChange(str);
  }
}
2
wombleton

Je vérifie toujours comme ça:

if(!myFunction){return false;}

il suffit de le placer avant tout code utilisant cette fonction

2
el Dude

J'avais le cas où le nom de la fonction variait en fonction d'une variable (var 'x' dans ce cas) ajoutée au nom de la fonction. Cela marche:

if ( typeof window['afunction_'+x] === 'function' ) { window['afunction_'+x](); } 
2
Sebastian H

J'ai essayé la réponse acceptée. toutefois:

console.log(typeof me.onChange);

renvoie 'undefined' . J'ai remarqué que la spécification indique un événement appelé 'onchange' au lieu de 'onChange' (notez le camelCase).

Changer la réponse initialement acceptée comme suit a fonctionné pour moi:

if (typeof me.onchange === "function") { 
  // safe to use the function
}
2
Alexander Fuchs
function js_to_as( str ){
     if (me && me.onChange)
         me.onChange(str);
}
2
MiffTheFox

Sans conditions

me.onChange=function(){};

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

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

Si vous recherchez une fonction qui est un plugin jQuery, vous devez utiliser $ .fn.myfunction.

if (typeof $.fn.mask === 'function') {
    $('.Zip').mask('00000');
}
1
Lucas Bustamante

Mettez le double point d'exclamation i.e !! avant le nom de la fonction que vous souhaitez vérifier. S'il existe, il retournera vrai.

function abc(){
}
!!window.abc; // return true
!!window.abcd; // return false
function function_exists(function_name)
{
    return eval('typeof ' + function_name) === 'function';
}
alert(function_exists('test'));
alert(function_exists('function_exists'));

OR

function function_exists(func_name) {
  //  discuss at: http://phpjs.org/functions/function_exists/
  // original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // improved by: Steve Clay
  // improved by: Legaev Andrey
  // improved by: Brett Zamir (http://brett-zamir.me)
  //   example 1: function_exists('isFinite');
  //   returns 1: true

  if (typeof func_name === 'string') {
    func_name = this.window[func_name];
  }
  return typeof func_name === 'function';
}
0
Mohammad Lotfi

Voici une solution simple et pratique pour vérifier l’existence d’une fonction et le tri dynamique de cette fonction par une autre fonction;

Fonction de déclenchement

function runDynmicFunction(functionname){ 

    if (typeof window[functionname] == "function"  ) { //check availability

        window[functionname]("this is from the function it "); //run function and pass a parameter to it
    }
}

et vous pouvez maintenant générer la fonction dynamiquement peut-être en utilisant php comme ça

function runThis_func(my_Parameter){

    alert(my_Parameter +" triggerd");
}

maintenant, vous pouvez appeler la fonction en utilisant un événement généré dynamiquement 

<?php

$name_frm_somware ="runThis_func";

echo "<input type='button' value='Button' onclick='runDynmicFunction(\"".$name_frm_somware."\");'>";

?>

le code HTML exact dont vous avez besoin est

<input type="button" value="Button" onclick="runDynmicFunction('runThis_func');">
0
Aylian Craspa
    function sum(nb1,nb2){

       return nb1+nb2;
    }

    try{

      if(sum() != undefined){/*test if the function is defined before call it*/

        sum(3,5);               /*once the function is exist you can call it */

      }

    }catch(e){

      console.log("function not defined");/*the function is not defined or does not exists*/
    }
0
Ir Calif

Et puis il y a ça ...

( document.exitPointerLock || Function )();
0
Master James

Essaye celui-là:

Window.function_exists=function(function_name,scope){
//Setting default scope of none is provided
If(typeof scope === 'undefined') scope=window;
//Checking if function name is defined
If (typeof function_name === 'undefined') throw new 
Error('You have to provide an valid function name!');
//The type container
var fn= (typeof scope[function_name]);
//Function type
If(fn === 'function') return true;
//Function object type
if(fn.indexOf('function')!== false) return true; 
return false;
}

Sachez que j'ai écrit ceci avec mon téléphone portable Peut contenir des problèmes de majuscules et/ou d'autres corrections nécessaires, telles que le nom de la fonction

Si vous voulez qu'une fonction comme PHP vérifie si la var est définie:

Window.isset=function (variable_con){
If(typeof variable_con !== 'undefined') return true;
return false;
}
0
SkullWritter

Pour illustrer les réponses précédentes, voici un bref extrait de JSFiddle: 

function test () {
console.log()

}

console.log(typeof test) // >> "function"

// implicit test, in javascript if an entity exist it returns implcitly true unless the element value is false as :
// var test = false
if(test){ console.log(true)}
else{console.log(false)}

// test by the typeof method
if( typeof test === "function"){ console.log(true)}
else{console.log(false)}


// confirm that the test is effective : 
// - entity with false value
var test2 = false
if(test2){ console.log(true)}
else{console.log(false)}

// confirm that the test is effective :
// - typeof entity
if( typeof test ==="foo"){ console.log(true)}
else{console.log(false)}

/* Expected :
function
true 
true 
false
false
*/

0
HoCo_