¿Cómo saber si se define una función en JavaScript?
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.
javascript
reflection
Aaron Lee
fuente
fuente
Todas las respuestas actuales usan una cadena literal, que prefiero no tener en mi código si es posible; esto no (y proporciona un significado semántico valioso, para arrancar):
Personalmente, trato de reducir la cantidad de cadenas que cuelgan 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 este último.fuente
isFunction(not_defined))
dondenot_defined
es el nombre de la función que no está definida y FireBug regresarnot_defined is not defined
lo cual es correcto, pero su función debe devolver falso y no generan errores ...not_defined
para pasarle su valorisFunction()
y no lo resuelve. No se puede hacer nada para definirisFunction()
este problema.isFunction
y haga lo justo(typeof no_function == typeof Function)
.typeof(Function())
porque Function es una función; pero también lo son Array, Object y otros prototipos incorporados (por falta de un término mejor). Si estuviera buscando una matriz que no usaría,typeof(array) === typeof(Array)
por ejemplo; usaríatypeof(array) === typeof(Array())
porque realmente necesita evaluar la función si está siendo cuidadoso y consistente.Tenga en cuenta que de devolución de llamada (por sí mismo) se evalúa como
false
si se trata deundefined
,null
,0
, ofalse
. En comparación connull
es demasiado específico.fuente
callback
se evalúa a sí mismo como un valor "falso-y", entonces su tipo nunca puede ser "función".Esos métodos para saber si se implementa una función también fallan si la variable no está definida, por lo que estamos usando algo más poderoso que admite recibir una cadena:
fuente
typeof window.doesthisexist
lugar dedoesthisexist
. Sin embargo, el uso de eval (que: es malo) como se muestra solo funcionará con funciones con nombre; esto no funcionaría con el caso de uso en la pregunta.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 La función no está definida.
Esto arrojará un
ReferenceError: possibleFunction is not defined
error cuando el motor intente resolver el símbolo posible Funció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
Esto establece que una variable 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.
fuente
Tratar:
fuente
fuente
fuente
if(typeof Function === typeof callback)...
? :)typeof
devuelve algo diferente más tarde (tal vez "Función" en lugar de "función"), debido a una implementación nueva / diferente de JavaScript; parece que sería menos probable que una implementación nueva / diferente rompería latypeof Function === typeof callback
verificación porque debería ser la misma a nivel semántico.fuente
yo podría hacer
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 motores JavaScript más nuevos,
finally
se puede utilizar a.fuente
typeof callback
todos modos.accepted_types.indexOf(typeof value) !== -1
si está en una variedad de tipos. En esta situación, las excepciones serían prohibitivas en mi opinión.Prueba esto:
fuente
Si nos fijamos en la fuente de la biblioteca @Venkat Sudheer Reddy Aedama mencionada, subrayado, puede ver esto:
Esta es solo mi SUGERENCIA, SUGERENCIA respuesta:>
fuente
Tratar:
fuente
Si usa http://underscorejs.org , tiene: http://underscorejs.org/#isFunction
fuente
Estaba buscando cómo verificar si se definió una función jQuery y no la encontré fácilmente.
Quizás lo necesite;)
fuente
type0f($.datepicker) !== undefiled
contrario seráobject
Si
callback()
está llamando no solo por una vez en una función, puede inicializar el argumento para su reutilización:Por ejemplo:
La limitación es que siempre ejecutará el argumento de devolución de llamada aunque no esté definido.
fuente
Para funciones globales, puede usar esta en lugar de la
eval
sugerida en una de las respuestas.Puedes usar
global.f instanceof Function
también, pero afaik. el valor deFunction
será diferente en diferentes cuadros, por lo que solo funcionará correctamente con una aplicación de un solo cuadro. Es por eso que generalmente usamostypeof
en su lugar. Tenga en cuenta que en algunos entornos también puede haber anomalíastypeof f
, por ejemplo, por MSIE 6-8, algunas de las funciones, por ejemplo,alert
tenían el tipo "objeto".Por funciones locales puede usar el de la respuesta aceptada. Puede probar si la función es local o global también.
Para responder a la pregunta, el código de ejemplo funciona para mí sin error en los últimos navegadores, por lo que no estoy seguro de cuál fue el problema:
Nota: usaría en
callback !== undefined
lugar decallback != null
, pero hacen casi lo mismo.fuente
La mayoría de las respuestas anteriores, si no todas, tienen efectos secundarios para invocar la función
aquí las mejores prácticas
tienes funcion
fuente
Si desea redefinir funciones, es mejor utilizar variables de función, que se definen en su orden de aparición, ya que las funciones se definen globalmente, sin importar dónde ocurran.
Ejemplo de crear una nueva función que llama a una función anterior del mismo nombre:
fuente
Esto funciono para mi
fuente
Solución de una línea:
fuente