Woran erkennt man, ob eine Funktion in JavaScript definiert ist?
Ich möchte so etwas tun
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
Aber es bringt mir ein
Rückruf ist keine Funktion
Fehler, wenn Rückruf nicht definiert ist.
javascript
reflection
Aaron Lee
quelle
quelle
Alle aktuellen Antworten verwenden eine Literalzeichenfolge, die ich nach Möglichkeit lieber nicht in meinem Code habe - dies ist nicht der Fall (und bietet zum Booten eine wertvolle semantische Bedeutung):
Persönlich versuche ich, die Anzahl der Zeichenfolgen in meinem Code zu reduzieren ...
Auch wenn mir bewusst ist, dass
typeof
es sich um einen Operator und nicht um eine Funktion handelt, kann die Verwendung der Syntax, die sie als letztere erscheinen lässt, wenig schaden.quelle
isFunction(not_defined))
wonot_defined
ist der Name der Funktion, der nicht definiert ist und FireBug zurückgegeben,not_defined is not defined
was korrekt ist, aber Ihre Funktion sollte false zurückgeben und keinen Fehler erzeugen ...not_defined
, um seinen Wert an zu übergeben,isFunction()
und es nicht auflöst. Es kann nichts unternommen werdenisFunction()
, um dieses Problem zu lösen.isFunction
und tun Sie es einfach(typeof no_function == typeof Function)
.typeof(Function())
weil Funktion eine Funktion ist; Dies gilt auch für Array-, Objekt- und andere integrierte Prototypen (mangels eines besseren Begriffs). Wenn Sie nach einem Array suchen würden, würden Sie es beispielsweise nicht verwendentypeof(array) === typeof(Array)
. Sie würden verwenden,typeof(array) === typeof(Array())
weil Sie die Funktion tatsächlich bewerten müssen, wenn Sie vorsichtig und konsistent sind.Beachten Sie, dass Rückruf (von selbst) auswertet , um ,
false
wenn esundefined
,null
,0
, oderfalse
. Der Vergleich mitnull
ist zu spezifisch.quelle
callback
Typ von "false-y" niemals "function" sein kann , wenn er selbst einen "false-y" -Wert ergibt.Diese Methoden, um festzustellen, ob eine Funktion implementiert ist, schlagen auch fehl, wenn keine Variable definiert ist. Daher verwenden wir etwas Stärkeres, das das Empfangen einer Zeichenfolge unterstützt:
quelle
typeof window.doesthisexist
stattdoesthisexist
. Die gezeigte Verwendung von eval (was: böse ist) funktioniert jedoch nur mit benannten Funktionen - dies würde mit dem Anwendungsfall in der Frage nicht funktionieren.Neu in JavaScript Ich bin nicht sicher, ob sich das Verhalten geändert hat, aber die von Jason Bunting (vor 6 Jahren) gegebene Lösung funktioniert nicht, wenn möglich. Die Funktion ist nicht definiert.
Dies wird einen
ReferenceError: possibleFunction is not defined
Fehler auslösen, wenn die Engine versucht, das Symbol "mögliche Funktion" aufzulösen (wie in den Kommentaren zu Jasons Antwort erwähnt).Um dieses Verhalten zu vermeiden, können Sie nur den Namen der Funktion übergeben, die Sie überprüfen möchten, ob sie vorhanden ist. Damit
Dadurch wird eine Variable entweder als die zu überprüfende Funktion oder als leeres Objekt festgelegt, wenn sie nicht definiert ist, und so werden die oben genannten Probleme vermieden.
quelle
Versuchen:
quelle
quelle
quelle
if(typeof Function === typeof callback)...
? :)typeof
später etwas anderes zurückzugeben (möglicherweise "Funktion" anstelle von "Funktion"), aufgrund einer neuen / anderen Implementierung von JavaScript - es scheint , dass dies weniger wahrscheinlich ist Eine neue / andere Implementierung würde dietypeof Function === typeof callback
Prüfung unterbrechen, da sie auf semantischer Ebene gleich sein sollte.quelle
Ich könnte tun
Ich weiß, dass es eine akzeptierte Antwort gibt, aber niemand hat dies vorgeschlagen. Ich bin mir nicht sicher, ob dies zur Beschreibung von idiomatisch passt, aber es funktioniert in allen Fällen.
In neueren JavaScript-Engines
finally
kann stattdessen a verwendet werden.quelle
typeof callback
sowieso.accepted_types.indexOf(typeof value) !== -1
, ob es sich um eine Reihe von Typen handelt. In dieser Situation wären Ausnahmen meiner Meinung nach unerschwinglich.Versuche dies:
quelle
Wenn Sie sich die Quelle der Bibliothek @Venkat Sudheer Reddy Aedama ansehen, die unterstrichen ist, können Sie Folgendes sehen:
Dies ist nur mein TIPP, TIPP Antwort:>
quelle
Versuchen:
quelle
Wenn Sie http://underscorejs.org verwenden , haben Sie: http://underscorejs.org/#isFunction
quelle
Ich suchte nach einer Möglichkeit, zu überprüfen, ob eine jQuery-Funktion definiert wurde, und fand sie nicht einfach.
Vielleicht braucht es das;)
quelle
type0f($.datepicker) !== undefiled
sonst wirdobject
Wenn
callback()
Sie eine Funktion nicht nur einmal aufrufen, können Sie das Argument für die Wiederverwendung initialisieren:Zum Beispiel:
Die Einschränkung besteht darin, dass das Rückrufargument immer ausgeführt wird, obwohl es nicht definiert ist.
quelle
Für globale Funktionen können Sie diese verwenden, anstatt
eval
sie in einer der Antworten vorzuschlagen.Sie können auch verwenden
global.f instanceof Function
, aber afaik. Der Wert vonFunction
ist in verschiedenen Frames unterschiedlich, sodass er nur mit einer einzelnen Frame-Anwendung ordnungsgemäß funktioniert. Deshalb verwenden wir normalerweisetypeof
stattdessen. Beachten Sie, dass in einigen Umgebungen auch Anomalien auftreten könnentypeof f
, z. B. bei MSIE 6-8. Einige der Funktionen hatten beispielsweisealert
den Typ "Objekt".Durch lokale Funktionen können Sie die in der akzeptierten Antwort verwenden. Sie können testen, ob die Funktion auch lokal oder global ist.
Um die Frage zu beantworten, funktioniert der Beispielcode in den neuesten Browsern fehlerfrei für mich, daher bin ich mir nicht sicher, wo das Problem lag:
Hinweis: Ich würde
callback !== undefined
anstelle von verwendencallback != null
, aber sie tun fast das gleiche.quelle
Die meisten, wenn nicht alle vorherigen Antworten haben Nebenwirkungen, um die Funktion aufzurufen
hier Best Practice
Sie haben Funktion
quelle
Wenn Sie Funktionen neu definieren möchten, verwenden Sie am besten Funktionsvariablen, die in der Reihenfolge ihres Auftretens definiert sind, da Funktionen global definiert sind, unabhängig davon, wo sie auftreten.
Beispiel für die Erstellung einer neuen Funktion, die eine vorherige gleichnamige Funktion aufruft:
quelle
Das hat bei mir funktioniert
quelle
Einzeilige Lösung:
quelle