Wie kann man sagen, wenn eine JavaScript-Funktion definiert ist
-
01-07-2019 - |
Frage
Wie sagen Sie, wenn eine Funktion in JavaScript definiert ist?
Ich möchte etwas tun
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
Aber es wird mir ein
Rückruf ist keine Funktion
Fehler beim Rückruf nicht definiert ist.
Lösung
typeof callback === "function"
Andere Tipps
All aktuellen Antworten eine Zeichenkette verwenden, die ich lieber nicht, wenn möglich, in meinem Code haben - das ist nicht (und liefert wertvolle semantische Bedeutung, zu booten):
function isFunction(possibleFunction) {
return typeof(possibleFunction) === typeof(Function);
}
Ich persönlich versuchen, die Anzahl der Saiten zu reduzieren um in meinem Code hängen ...
Auch wenn ich weiß, dass typeof
ein Operator ist und keine Funktion ist, gibt es wenig Schaden in Syntax, die es wie diese erscheinen läßt.
if (callback && typeof(callback) == "function")
, dass die Callback-Hinweis (selbst) ausgewertet false
wenn es undefined
, null
, 0
ist, oder false
. Im Vergleich zu null
ist zu spezifisch.
Diese Methoden sagen, ob eine Funktion implementiert wird auch fehlschlagen, wenn die Variable nicht so definiert ist, verwenden wir etwas stärker, dass Träger eine Zeichenfolge empfangen:
function isFunctionDefined(functionName) {
if(eval("typeof(" + functionName + ") == typeof(Function)")) {
return true;
}
}
if (isFunctionDefined('myFunction')) {
myFunction(foo);
}
New JavaScript Ich bin nicht sicher, ob das Verhalten, sondern die Lösung gegeben von Jason Bunting (Vor 6 Jahren) wird nicht funktionieren, wenn possibleFunction definiert ist, hat sich nicht geändert.
function isFunction(possibleFunction) {
return (typeof(possibleFunction) == typeof(Function));
}
Dies wird einen ReferenceError: possibleFunction is not defined
Fehler werfen, wenn der Motor das Symbol possibleFunction zu lösen versucht (wie in den Kommentaren zu Jasons Antwort erwähnt)
Um dieses Problem zu vermeiden, können Sie nur den Namen der Funktion übergeben Sie überprüfen möchten, wenn es vorhanden ist. So
var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;
Dies setzt eine Variable entweder die gewünschte Funktion zu überprüfen oder das leere Objekt zu sein, wenn sie nicht definiert ist und vermeidet so die oben genannten Themen.
Versuchen:
if (typeof(callback) == 'function')
ich tun könnte,
try{
callback();
}catch(e){};
Ich weiß, dass es eine akzeptierte Antwort, aber niemand schlägt dies. Ich bin nicht wirklich sicher, ob dies die Beschreibung von idiomatischen paßt, aber es funktioniert für alle Fälle.
In neuerer JavaScript-Engine kann ein finally
stattdessen verwendet werden.
if ('function' === typeof callback) ...
typeof(callback) == "function"
function something_cool(text, callback){
alert(text);
if(typeof(callback)=='function'){
callback();
};
}
Versuchen Sie folgendes:
callback instanceof Function
Wenn Sie auf der Quelle der Bibliothek suchen @Venkat Sudheer Reddy Aedama erwähnt, Underscore.js, Sie können das sehen:
_.isFunction = function(obj) {
return typeof obj == 'function' || false;
};
Die ist nur meine HINT, HINT Antwort:>
Versuchen:
if (!(typeof(callback)=='undefined')) {...}
Wenn Sie http://underscorejs.org , Sie haben: http://underscorejs.org/#isFunction
_.isFunction(callback);
Ich war auf der Suche nach, wie man überprüfen, ob eine jQuery-Funktion definiert wurde und ich habe es nicht leicht finden.
Vielleicht brauchen sie;)
if(typeof jQuery.fn.datepicker !== "undefined")
Wenn die callback()
Sie anrufen, nicht nur für eine Zeit in einer Funktion, können Sie das Argument für die Wiederverwendung nicht initialisieren:
callback = (typeof callback === "function") ? callback : function(){};
Zum Beispiel:
function something_cool(text, callback) {
// Initialize arguments
callback = (typeof callback === "function") ? callback : function(){};
alert(text);
if (text==='waitAnotherAJAX') {
anotherAJAX(callback);
} else {
callback();
}
}
Die Einschränkung ist, dass es immer das Callback-Argument ausführen, obwohl es nicht definiert ist.
Für globale Funktionen können Sie diese benutzen, anstatt eval
in eine der Antworten vorgeschlagen.
var global = (function (){
return this;
})();
if (typeof(global.f) != "function")
global.f = function f1_shim (){
// commonly used by polyfill libs
};
Sie können mit global.f instanceof Function
als gut, aber afaik. der Wert der Function
wird in verschiedenen Rahmen unterschiedlich sein, so dass es eigentlich nur mit einer einzigen Frame-Anwendung arbeiten. Deshalb haben wir in der Regel typeof
stattdessen verwenden. Beachten Sie, dass in manchen Umgebungen kann es Anomalien mit typeof f
auch z.B. von MSIE 6-8 einige der Funktionen, zum Beispiel alert
hatten „Objekt“ Typen.
Durch lokale Funktionen können Sie die eine in der akzeptierten Antwort verwenden. Sie können testen, ob die Funktion auch lokal oder global ist.
if (typeof(f) == "function")
if (global.f === f)
console.log("f is a global function");
else
console.log("f is a local function");
Um die Frage zu beantworten, der Beispielcode ist für mich arbeiten, ohne Fehler in neuestem browers, also ist mir nicht sicher, was das Problem mit ihm war:
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
. Hinweis: Ich würde callback !== undefined
statt callback != null
verwenden, aber sie tun fast das gleiche
Die meisten, wenn nicht alle bisherigen Antworten Nebenwirkungen haben die Funktion
aufzurufenhier best practice
Sie haben Funktion
function myFunction() {
var x=1;
}
//direct way
if( (typeof window.myFunction)=='function')
alert('myFunction is function')
else
alert('myFunction is not defined');
//byString
var strFunctionName='myFunction'
if( (typeof window[strFunctionName])=='function')
alert(s+' is function');
else
alert(s+' is not defined');
Ein-Zeilen-Lösung:
function something_cool(text, callback){
callback && callback();
}