Estoy tratando de pasar algún parámetro a una función utilizada como devolución de llamada, ¿cómo puedo hacer eso?
function tryMe (param1, param2) {
alert (param1 + " and " + param2);
}
function callbackTester (callback, param1, param2) {
callback (param1, param2);
}
callbackTester (tryMe, "hello", "goodbye");
Respuestas:
Si desea algo un poco más general, puede usar la variable de argumentos de esta manera:
Pero de lo contrario, su ejemplo funciona bien (los argumentos [0] se pueden usar en lugar de la devolución de llamada en el probador)
fuente
callback.apply(arguments)
ya que el cuerpo de la funcióncallbackTester
es extensible más allá del escenario de dos argumentos.Esto también funcionaría:
Otro escenario:
fuente
if (typeof window[callback] == 'function') window[callback].call(this);
Tu pregunta no está clara. Si está preguntando cómo puede hacer esto de una manera más simple, debería echar un vistazo al método ECMAScript 5th edition .bind () , que es miembro de Function.prototype . Al usarlo, puedes hacer algo como esto:
También puede usar el siguiente código, que agrega el método si no está disponible en el navegador actual:
Ejemplo
bind () - Documentación PrototypeJS
fuente
Array.prototype.slice.call(arguments)
yarguments.slice()
?f = function(arg1,arg2){alert(arg1+arg2);}.bind(this,"abc");
f("def") // Gives "abcdef"
Cuando tiene una devolución de llamada que será llamada por algo diferente a su código con un número específico de parámetros y desea pasar parámetros adicionales, puede pasar una función de contenedor como la devolución de llamada y dentro del contenedor pasar los parámetros adicionales.
fuente
Si no está seguro de cuántos parámetros pasará a las funciones de devolución de llamada, use
apply
function.fuente
Envuelva las funciones 'secundarias' que se pasan como / con argumentos dentro de los contenedores de funciones para evitar que se evalúen cuando se llama a la función 'principal'.
fuente
Código de una pregunta con cualquier número de parámetros y un contexto de devolución de llamada:
fuente
Use la función curry como en este simple ejemplo.
fuente
Una nueva versión para el escenario en el que alguna otra función invocará la devolución de llamada, no su propio código, y desea agregar parámetros adicionales.
Por ejemplo, supongamos que tiene muchas llamadas anidadas con devoluciones de llamada correctas y erróneas. Usaré promesas angulares para este ejemplo, pero cualquier código de JavaScript con devoluciones de llamada sería el mismo para ese propósito.
Ahora es posible que desee ordenar su código definiendo una función para registrar errores, manteniendo el origen del error para fines de depuración. Así es como procedería a refactorizar su código:
La función de llamada aún agregará el parámetro de error después de los parámetros de la función de devolución de llamada.
fuente
Estaba buscando lo mismo y terminé con la solución y aquí es un ejemplo simple si alguien quiere pasar por esto.
También publicado en la otra pregunta aquí
fuente
Permíteme darte un ejemplo de estilo Node.js muy simple de usar una devolución de llamada:
y el HTML que representará el resultado:
Puede jugar con él aquí: https://jsfiddle.net/q8gnvcts/ , por ejemplo, intente pasar una cadena en lugar del número: myTest ('alguna cadena', 6, función (err, resultado) ... y vea el resultado.
Espero que este ejemplo ayude porque representa la idea muy básica de las funciones de devolución de llamada.
fuente
Lea más sobre la sintaxis de propagación
fuente
fuente