Hoe te controleren of een functie in JavaScript bestaat?

Mijn code is

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

Soms wordt mijn onChangeechter niet geladen. Firebug-fouten met

me.onChange is geen functie

Ik wil gracieus degraderen omdat dit niet de belangrijkste functie in mijn programma is. typeofgeeft dezelfde fout.

Enige suggesties om ervoor te zorgen dat het bestaat en dan alleen onChangeuit te voeren?

(Geen van de onderstaande methoden behalve proberen één werk te vangen)


Antwoord 1, autoriteit 100%

Probeer zoiets als dit:

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

of beter nog (volgens UpTheCreek upvoted commentaar)

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

Antwoord 2, autoriteit 9%

Ik had dit probleem.

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

bleef een referentiefout geven als obj ongedefinieerd was.

Uiteindelijk heb ik het volgende gedaan:

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

Een collega wees me erop dat controleren of het !== 'undefined'is en dan === 'function'natuurlijk overbodig is.

Eenvoudiger:

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

Veel schoner en werkt geweldig.


Antwoord 3, autoriteit 4%

Modern JavaScript om te redden!

In 2021 is dit opgelost* in JavaScript (en TypeScript) met de nieuwe Optionele ketensyntaxis.

me.onChange?.(str)

Als onChangebestaat, wordt het aangeroepen.

Als onChangeniet bestaat, gebeurt er niets: de expressie retourneert undefined.

Dus voor let value = me.onChange?.(str), wordt valueniet gedefinieerd als onChangeniet bestaat.

p>

Let op, als onChangebestaat maar geeneen functie is, genereert het een TypeErrornet alsof je een niet-functie aanroept als een functie. Optionele Chaining doet geen magie om dit te laten verdwijnen.

* Optionele Chaining is nog steeds een fase 4 TC39-voorstel, dus technisch nog niet in de ECMAScript-specificatie. Maar fase 4 betekent dat het in wezen gegarandeerd wordt opgenomen in de volgende versie. Je kunt de syntaxis vandaag gebruiken via Babel of TypeScript met het vertrouwen dat deze niet zal veranderen.


Antwoord 4

Als je eval gebruikt om een string naar functie te converteren, en je wilt controleren of deze eval’d-methode bestaat, gebruik dan typeofen je functiestring in een eval:

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

Keer dit niet om en probeer een typeofop eval. Als je dat doet, wordt er een ReferenceError gegenereerd:

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

Antwoord 5

Wat dacht je van:

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

bijv.

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

of wat uw geval betreft:

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

Zie MDN-documenten.


Antwoord 6

Probeer typeof— Zoek naar 'undefined'om te zeggen dat het niet bestaat, 'function'voor een functie. JSFiddle voor deze code

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

Of als een als:

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

Of met een retourwaarde, op een enkele regel:

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

Antwoord 7

Heb dit niet voorgesteld:
me.onChange && me.onChange(str);

Als me.onChange ongedefinieerd is (wat het zal zijn als het niet is gestart), zal het het laatste deel niet uitvoeren. Als me.onChange een functie is, zal het me.onChange(str) uitvoeren.

Je kunt zelfs verder gaan en het volgende doen:

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

voor het geval ik ook async ben.


Antwoord 8

Voor mij de gemakkelijkste manier:

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

Antwoord 9

//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");
    }

Antwoord 10

Ik ga nog een stap verder om er zeker van te zijn dat de eigenschap inderdaad een functie is

function js_to_as( str ){
     if (me && me.onChange && typeof me.onChange === 'function') {
         me.onChange(str);
     }
}

Antwoord 11

Zet een dubbel uitroepteken, d.w.z. !! vóór de functienaam die u wilt controleren. Als het bestaat, wordt het true geretourneerd.

function abc(){
}
!!window.abc; // return true
!!window.abcd; // return false

Antwoord 12

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

Antwoord 13

Ik gebruik deze methode graag:

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

Gebruik:

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

Antwoord 14

Ik had het geval waarin de naam van de functie varieerde volgens een variabele (var ‘x’ in dit geval) toegevoegd aan de functienaam. Dit werkt:

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

Antwoord 15

De Underscore.js-bibliotheek definieert het in de isFunction-methode als volgt (waarvan de opmerkingen suggereren dat dit een aantal browserbugs kan verhelpen)

typeof obj == 'function' || false

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


Antwoord 16

Als u zoekt naar een functie die een jQuery-plug-in is, moet u $.fn.myfunction gebruiken

if (typeof $.fn.mask === 'function') {
    $('.zip').mask('00000');
}

Antwoord 17

function function_exists(function_name)
{
    return eval('typeof ' + function_name) === 'function';
}
alert(function_exists('test'));
alert(function_exists('function_exists'));

OF

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';
}

Antwoord 18

Zonder voorwaarden

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);
}

Antwoord 19

Ik vermoed dat meniet correct wordt toegewezen aan onload.

Het verplaatsen van de get_ID-aanroep naar de onclick-gebeurtenis zou dit moeten oplossen.

Natuurlijk kun je verder vallen zoals eerder vermeld:

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

Antwoord 20

Ik controleer altijd als volgt:

if(!myFunction){return false;}

plaats het gewoon voor elke code die deze functie gebruikt


Antwoord 21

Deze eenvoudige jQuery-code zou het lukken:

if (jQuery.isFunction(functionName)) {
    functionName();
}

Antwoord 22

Ik heb het geaccepteerde antwoord geprobeerd; echter:

console.log(typeof me.onChange);

retourneert ‘undefined’.
Ik heb gemerkt dat de specificatie een gebeurtenis vermeldt met de naam ‘onchange’ in plaats van ‘onChange’ (let op de camelCase).

Het wijzigen van het oorspronkelijk geaccepteerde antwoord in het volgende werkte voor mij:

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

Antwoord 23

Ik ben ook op zoek geweest naar een elegante oplossing voor dit probleem. Na lang nadenken vond ik deze aanpak het beste.

const func = me.onChange || (str => {});
func(str)
;


Antwoord 24

In een paar woorden: vang de uitzondering.

Het verbaast me echt dat nog niemand heeft gereageerd of gereageerd op Exception Catch op dit bericht.

Detail: Hier volgt een voorbeeld waarin ik probeer een functie te matchen die wordt voorafgegaan door mask_ en als achtervoegsel door het formulierveld “name”. Wanneer JavaScript de functie niet vindt, zou het een ReferenceErrormoeten genereren die u naar wens kunt afhandelen in de catch-sectie.

function inputMask(input) {
  try {
    let maskedInput = eval("mask_"+input.name);
    if(typeof maskedInput === "undefined")
        return input.value;
    else
        return eval("mask_"+input.name)(input);
  } catch(e) {
    if (e instanceof ReferenceError) {
      return input.value;
    }
  }
}

Antwoord 25

Hier is een werkende en eenvoudige oplossing om het bestaan van een functiete controleren en die functie dynamisch te activerendoor een andere functie;

Triggerfunctie

function runDynamicFunction(functionname){ 
    if (typeof window[functionname] == "function") { //check availability
        window[functionname]("this is from the function it"); // run function and pass a parameter to it
    }
}

en je kunt de functie nu dynamisch genereren, misschien met behulp van php op deze manier

function runThis_func(my_Parameter){
    alert(my_Parameter +" triggerd");
}

nu kun je de functie aanroepen met een dynamisch gegenereerde gebeurtenis

<?php
$name_frm_somware ="runThis_func";
echo "<input type='button' value='Button' onclick='runDynamicFunction(\"".$name_frm_somware."\");'>";
?>

de exacte HTML-code die je nodig hebt is

<input type="button" value="Button" onclick="runDynamicFunction('runThis_func');">

Antwoord 26

   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*/
    }

Antwoord 27

En dan is er nog dit…

( document.exitPointerLock || Function )();

Antwoord 28

Probeer deze:

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;
}

Houd er rekening mee dat ik dit met mijn mobiel heb geschreven
Kan enkele hoofdletters bevatten en/of andere correcties die nodig zijn, zoals bijvoorbeeld functienaam

Als je wilt dat een functie zoals PHP controleert of de var is ingesteld:

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

Antwoord 29

Om de voorgaande antwoorden te illustreren, hier een kort JSFiddle-fragment:

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
*/

Antwoord 30

Ik raad aan om:

function hasMethod(subject, methodName) {
  return subject != null && typeof subject[methodName] == "function";
}

De eerste controle subject != nullfiltert nullish-waarden (nullen undefined) uit die geen eigenschappen hebben. Zonder deze controle zou subject[methodName]een foutmelding kunnen geven:

TypeError: (undefined|null) heeft geen eigenschappen

Alleen een waarheidswaarde controleren is niet genoeg, aangezien 0en ""beide vals zijn, maar wel eigenschappen hebben.

Na validatie dat subjectniet ongeldig is, kunt u veilig toegang krijgen tot de eigenschap en controleren of deze overeenkomt met typeof subject[methodName] == "function".


Als u dit op uw code toepast, kunt u nu het volgende doen:

if (hasMethod(me, "onChange")) {
  me.onChange(str);
}

Other episodes