350 Stimmen

Wie man feststellt, ob eine JavaScript-Funktion definiert ist

Woran erkennt man, ob eine Funktion in JavaScript definiert ist?

Ich möchte etwas in der Art machen

function something_cool(text, callback) {
    alert(text);
    if( callback != null ) callback();
}

Aber es verschafft mir einen

Callback ist keine Funktion

Fehler, wenn Callback nicht definiert ist.

1voto

miguelmpn Punkte 1547

Ich war auf der Suche danach, wie man überprüfen kann, ob eine jQuery-Funktion definiert wurde, und ich habe es nicht leicht gefunden.

Vielleicht brauchen Sie es ja ;)

if(typeof jQuery.fn.datepicker !== "undefined")

1voto

Nick Tsai Punkte 3357

Wenn die callback() Sie nicht nur einmal in einer Funktion aufrufen, können Sie das Argument zur Wiederverwendung 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 das Callback-Argument immer ausgeführt wird, auch wenn es undefiniert ist.

1voto

TexWiller Punkte 188

Die meisten, wenn nicht sogar alle vorherigen Antworten haben Nebeneffekte, um die Funktion aufzurufen

hier beste Praxis

Sie haben eine Funktion

function myFunction() {
        var x=1;
    }

direkter Weg, um sie zu testen

//direct way
        if( (typeof window.myFunction)=='function')
            alert('myFunction is function')
        else
            alert('myFunction is not defined');

Verwendung einer Zeichenkette, so dass Sie nur eine Stelle haben, um den Funktionsnamen zu definieren

//byString
        var strFunctionName='myFunction'
        if( (typeof window[strFunctionName])=='function')
            alert(s+' is function');
        else
            alert(s+' is not defined');

0voto

inf3rno Punkte 22107

Für globale Funktionen können Sie diese anstelle von eval in einer 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 verwenden global.f instanceof Function auch, aber afaik. der Wert der Function wird in verschiedenen Frames unterschiedlich sein, so dass es nur bei einer Einzelbildanwendung richtig funktioniert. Deshalb verwenden wir normalerweise typeof stattdessen. Beachten Sie, dass es in manchen Umgebungen zu Anomalien kommen kann mit typeof f auch, z.B. von MSIE 6-8 einige der Funktionen z.B. alert hatte den Typ "Objekt".

Bei lokalen Funktionen können Sie die in der akzeptierten Antwort enthaltene verwenden. Sie können auch testen, ob die Funktion 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 funktioniert bei mir ohne Fehler in den neuesten Browsern, daher bin ich mir nicht sicher, wo das Problem lag:

function something_cool(text, callback) {
    alert(text);
    if( callback != null ) callback();
}

Anmerkung: Ich würde verwenden callback !== undefined anstelle von callback != null aber sie tun fast dasselbe.

0voto

David Spector Punkte 1194

Wenn Sie Funktionen umdefinieren möchten, verwenden Sie am besten Funktionsvariablen, die in der Reihenfolge ihres Auftretens definiert werden, da Funktionen global definiert werden, unabhängig davon, wo sie vorkommen.

Beispiel für die Erstellung einer neuen Funktion, die eine frühere Funktion mit demselben Namen aufruft:

A=function() {...} // first definition
...
if (typeof A==='function')
   oldA=A;
A=function() {...oldA()...} // new definition

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