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.

War es hilfreich?

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

aufzurufen

hier best practice

Sie haben Funktion

function myFunction() {
        var x=1;
    }
direkte Art und Weise auf sie zu prüfen

//direct way
        if( (typeof window.myFunction)=='function')
            alert('myFunction is function')
        else
            alert('myFunction is not defined');
mit einem String, so können Sie nur einen Ort haben Funktionsnamen definieren

//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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top