806 Stimmen

Wie prüft man, ob eine Funktion in JavaScript existiert?

Mein Code lautet

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

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

Aber manchmal ist mein onChange wird nicht geladen. Firebug-Fehler mit

me.onChange ist keine Funktion

Ich möchte die Leistung schonend abbauen, da dies nicht die wichtigste Funktion in meinem Programm ist. typeof führt zu demselben Fehler.

Irgendwelche Vorschläge, wie man sicherstellen kann, dass sie existiert und dann nur onChange ?

(Keine der folgenden Methoden außer try catch one funktioniert)

1616voto

Andrew Hare Punkte 332190

Versuchen Sie so etwas:

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

oder noch besser (gemäß dem von UpTheCreek hochgestimmten Kommentar)

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

193voto

davnicwil Punkte 24441

Modernes JavaScript zur Rettung!

Im Jahr 2022 wird dies in JavaScript (und TypeScript) mit dem neuen Optionale Verkettung Syntax.

me.onChange?.(str)

Si onChange existiert, wird sie aufgerufen.

Si onChange nicht vorhanden ist, passiert nichts: Der Ausdruck gibt undefined .

Also für let value = me.onChange?.(str) , value undefiniert sein wird, wenn onChange gibt es nicht.

Hinweis: Wenn onChange existiert, ist aber no eine Funktion, löst sie eine TypeError genau so, wie wenn Sie eine Nicht-Funktion als Funktion aufrufen. Die optionale Verkettung bewirkt nicht, dass dies verschwindet.

* Optionale Verkettung ist eine Stufe 4 <a href="https://github.com/tc39/proposal-optional-chaining" rel="noreferrer">TC39-Vorschlag </a>Das heißt, es ist noch nicht offiziell in der ECMAScript-Spezifikation enthalten, wird aber mit Sicherheit in der nächsten Version enthalten sein. Sie können es heute über Babel oder TypeScript verwenden und sicher sein, dass sich die Syntax nicht ändern wird.

166voto

Misha Nasledov Punkte 1753

Ich hatte dieses Problem.

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

einen Referenzfehler aus, wenn obj undefiniert war.

Am Ende habe ich Folgendes getan:

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

Ein Kollege wies mich darauf hin, dass die Überprüfung, ob es sich um !== 'undefined' und dann === 'function' ist natürlich überflüssig.

Einfacher:

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

Viel sauberer und funktioniert großartig.

28voto

Nasser Al-Wohaibi Punkte 4369

Wie wäre es damit:

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

z.B..

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

oder wie in Ihrem Fall:

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

Siehe MDN-Dokumente .

22voto

dhulihan Punkte 10633

Wenn Sie eval verwenden, um eine Zeichenkette in eine Funktion umzuwandeln, und Sie überprüfen wollen, ob diese eval'd-Methode existiert, sollten Sie typeof und Ihre Funktionszeichenfolge innerhalb einer eval :

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

Versuchen Sie nicht, dies umzukehren und eine typeof en eval . Wenn Sie dies tun, wird ein ReferenceError ausgelöst:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X