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;
}
//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'');
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:>
Si usa http://underscorejs.org , tiene: http://underscorejs.org/#isFunction
_.isFunction(callback);
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"