valor validacion una tipos retornar quitar pasar parametros funciones funcion formularios ejemplos desde con como anidadas javascript reflection

validacion - Cómo saber si una función de JavaScript está definida



undefined javascript (19)

¿Cómo saber 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 pone un

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

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


Estaba buscando cómo verificar si se definió una función jQuery y no la encontré fácilmente.

Quizás lo necesite;)

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


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

aquí la mejor práctica

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 un solo 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'');


Los 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 dada por Jason Bunting (hace 6 años) no funcionará si es posible que no se haya definido la función.

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

Esto generará un error ReferenceError: possibleFunction is not defined ya que el motor intenta resolver el símbolo possibleFunction (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. Asi que

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

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


Para las funciones globales, puede usar este 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 afaik. El valor de la Function será diferente en diferentes marcos, por lo que funcionará solo con una aplicación de marco único correctamente. Es por eso que usamos typeof lugar. Tenga en cuenta que en algunos entornos también puede haber anomalías con typeof f , por ejemplo, por MSIE 6-8, algunas de las funciones, por ejemplo, alert tenían el tipo "objeto".

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

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 me funciona sin error en los últimos browers, 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 lugar de callback != null , pero hacen casi lo mismo.


Prueba esto:

callback instanceof Function


Si la callback() que está llamando no solo por una vez en una función, podría inicializar el argumento para su reutilización:

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.


Si observa la source de la biblioteca @Venkat Sudheer Reddy Aedama mencionada, underscorejs, puede ver esto:

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

Esto es solo mi SUGERENCIA, SUGERENCIA, respuesta:>



Solución de una línea:

function something_cool(text, callback){ callback && callback(); }


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

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

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

Además, aunque soy consciente de que typeof es un operador y no una función, hay poco daño en el uso de la sintaxis que lo hace aparecer como el último.


Tratar:

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


Tratar:

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


yo podría hacer

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

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

En los nuevos motores de JavaScript se puede usar un finally su lugar.


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


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


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

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


typeof callback === "function"


typeof(callback) == "function"