Entiendo pasar una función a otra función como devolución de llamada y hacer que se ejecute, pero no entiendo la mejor implementación para hacerlo. Estoy buscando un ejemplo muy básico, como este:
var myCallBackExample = {
myFirstFunction : function( param1, param2, callback ) {
// Do something with param1 and param2.
if ( arguments.length == 3 ) {
// Execute callback function.
// What is the "best" way to do this?
}
},
mySecondFunction : function() {
myFirstFunction( false, true, function() {
// When this anonymous function is called, execute it.
});
}
};
En myFirstFunction, si devuelvo una nueva devolución de llamada (), entonces funciona y ejecuta la función anónima, pero no me parece el enfoque correcto.
arguments
no es una matriz, aún puedes hacer referencia a su longitud comoarguments.length
: pruébalo. Esta propiedad se refiere al número de argumentos realmente pasados, y no necesariamente al número de parámetros en la firma de la función.Respuestas:
Solo puedes decir
Alternativamente, puede utilizar el
call
método si desea ajustar el valor dethis
la devolución de llamada.Dentro de la función
this
estaría lo quenewValueForThis
sea.fuente
Debe verificar si la devolución de llamada existe y si es una función ejecutable:
Muchas bibliotecas (jQuery, dojo, etc.) usan un patrón similar para sus funciones asincrónicas, así como node.js para todas las funciones asíncronas (nodejs generalmente pasa
error
ydata
para la devolución de llamada). ¡Mirar en su código fuente ayudaría!fuente
callback
en cadena y luego se verifica su tipo? ¿Mejorará esto el rendimiento? Esto es como verificar el tipo, verificar si el booleano convertido devuelve verdadero y luego verificar su tipo nuevamente y probarlo contra la cadena ... ¿Podría explicar por qué?typeof(callback)
lograrías por ti?typeof(null) === "Object"
,typeof("undefined") === "undefined"
callback
no se está convirtiendo en una cadena, se está comprobando su tipo para ver si es una función, antes de que se llame. Presumiblemente, el código aceptacallback
como argumento, y no está seguro de que el argumento sea de un tipo invocable, o tal vez los argumentos sean de varios tipos en un intento de proporcionar una forma de polimorfismo en el que el código pueda reaccionar de manera diferente a diferentestypeof
argumentos.Hay 3 posibilidades principales para ejecutar una función:
El método que elija depende de si:
Documentos para Function.call , Function.apply
fuente
Las devoluciones de llamada se refieren a señales y "nuevo" se trata de crear instancias de objetos.
En este caso, sería aún más apropiado ejecutar solo "callback ();" que "return new callback ()" porque de todos modos no está haciendo nada con un valor de retorno.
(Y la prueba argumentos.length == 3 es realmente torpe, mejor, mejor comprobar que el parámetro de devolución de llamada existe y es una función).
fuente
la implementación adecuada sería:
esto hace que el parámetro de devolución de llamada sea opcional.
fuente
Puedes usar:
El siguiente ejemplo es un poco más completo:
fuente
Aquí hay un ejemplo básico que explica la
callback()
función en JavaScript:JSFiddle
fuente
fuente