Pregunta

¿Cómo se sabe si una función en JavaScript está definida?

quiero hacer algo como esto

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

Pero me da un

la devolución de llamada no es una función

error cuando la devolución de llamada no está definida.

¿Fue útil?

Solución

typeof callback === "function"

Otros consejos

Todas las respuestas actuales utilizan una cadena literal, que prefiero no tener en mi código si es posible; esto no es así (y proporciona un significado semántico valioso, para empezar):

function isFunction(possibleFunction) {
  return typeof(possibleFunction) === typeof(Function);
}

Personalmente, trato de reducir la cantidad de cadenas que aparecen en mi código...


Además, si bien soy consciente de que typeof es un operador y no una función, no hay mucho daño en usar una sintaxis que la haga aparecer como esta última.

if (callback && typeof(callback) == "function")

Tenga en cuenta que la devolución de llamada (por sí sola) se evalúa como false si esto es undefined, null, 0, o false.Comparado a null es demasiado específico.

Esos métodos para saber si una función está implementada también fallan si la variable no está definida, por lo que estamos usando algo más poderoso que admite recibir una cadena:

function isFunctionDefined(functionName) {
    if(eval("typeof(" + functionName + ") == typeof(Function)")) {
        return true;
    }
}

if (isFunctionDefined('myFunction')) {
    myFunction(foo);
}

Nuevo en JavaScript, no estoy seguro de si el comportamiento ha cambiado, pero la solución proporcionada por Jason Bunting (hace 6 años) no funcionará si es posible. La función no está definida.

function isFunction(possibleFunction) {
  return (typeof(possibleFunction) == typeof(Function));
}

Esto arrojará un ReferenceError: possibleFunction is not defined error cuando el motor intenta resolver el símbolo posibleFunción (como se menciona en los comentarios a la respuesta de Jason)

Para evitar este comportamiento, solo puede pasar el nombre de la función que desea verificar si existe.Entonces

var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;

Esto configura una variable para que sea la función que desea verificar o el objeto vacío si no está definido y así evita los problemas mencionados anteriormente.

Intentar:

if (typeof(callback) == 'function')

yo podría hacer

try{
    callback();
}catch(e){};

Sé que hay una respuesta aceptada, pero nadie sugirió esto.No estoy realmente seguro de si esto se ajusta a la descripción de idiomático, pero funciona en todos los casos.

En los motores JavaScript más nuevos, finally se puede utilizar en su lugar.

if ('function' === typeof callback) ...
typeof(callback) == "function"
function something_cool(text, callback){
    alert(text);
    if(typeof(callback)=='function'){ 
        callback(); 
    };
}

Prueba esto:

callback instanceof Function

Si miras el fuente de la biblioteca que @Venkat Sudheer Reddy Aedama mencionó, subrayadojs, puedes ver esto:

_.isFunction = function(obj) {
  return typeof obj == 'function' || false;
};

Esta es solo mi PISTA, PISTA respuesta :>

Intentar:

if (!(typeof(callback)=='undefined')) {...}

Si utiliza http://underscorejs.org, tienes:http://underscorejs.org/#isFunction

_.isFunction(callback);

Estaba buscando como comprobar si estaba definida una función de jQuery y no la encontré fácilmente.

Quizás lo necesite ;)

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

Si el callback() está llamando no solo una vez en una función, puede inicializar el argumento para reutilizarlo:

callback = (typeof callback === "function") ? callback : function(){};

Por ejemplo:

function something_cool(text, callback) {
    // Initialize arguments
    callback = (typeof callback === "function") ? callback : function(){};

    alert(text);

    if (text==='waitAnotherAJAX') {
        anotherAJAX(callback);
    } else {
        callback();
    }
}

La limitación es que siempre ejecutará el argumento de devolución de llamada aunque no esté definido.

Para funciones globales puedes usar esta en lugar de eval sugerido en una de las respuestas.

var global = (function (){
    return this;
})();

if (typeof(global.f) != "function")
    global.f = function f1_shim (){
        // commonly used by polyfill libs
    };

Puedes usar global.f instanceof Function también, pero que yo sepa.el valor de la Function será diferente en diferentes marcos, por lo que funcionará correctamente solo con una aplicación de un solo marco.Por eso solemos usar typeof en cambio.Tenga en cuenta que en algunos entornos puede haber anomalías con typeof f también, p.e.por MSIE 6-8 algunas de las funciones, por ejemplo alert tenía tipo "objeto".

Por funciones locales puedes usar la de la respuesta aceptada.También puedes probar si la función es local o global.

if (typeof(f) == "function")
    if (global.f === f)
        console.log("f is a global function");
    else
        console.log("f is a local function");

Para responder a la pregunta, el código de ejemplo funciona sin errores en los navegadores más recientes, por lo que no estoy seguro de cuál fue el problema:

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

Nota:yo usaría callback !== undefined en lugar de callback != null, pero hacen casi lo mismo.

La mayoría, si no todas, las respuestas anteriores tienen efectos secundarios al invocar la función.

aquí las mejores prácticas

tienes función

function myFunction() {
        var x=1;
    }
forma directa de probarlo

//direct way
        if( (typeof window.myFunction)=='function')
            alert('myFunction is function')
        else
            alert('myFunction is not defined');
usando una cadena para que pueda tener solo un lugar para definir el nombre de la función

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

Solución de una línea:

function something_cool(text, callback){
    callback && callback();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top