JavaScript: pasar parámetros a una función de devolución de llamada

Resuelto vitto asked hace 14 años • 17 respuestas

Estoy intentando pasar algún parámetro a una función utilizada como callback, ¿cómo puedo hacerlo?

Este es mi intento:

function tryMe(param1, param2) {
  alert(param1 + " and " + param2);
}

function callbackTester(callback, param1, param2) {
  callback(param1, param2);
}

callbackTester(tryMe, "hello", "goodbye");
Expandir fragmento

vitto avatar Aug 11 '10 20:08 vitto
Aceptado

Si quieres algo un poco más general, puedes usar la variable de argumentos así:

function tryMe(param1, param2) {
  alert(param1 + " and " + param2);
}

function callbackTester(callback) {
  callback(arguments[1], arguments[2]);
}

callbackTester(tryMe, "hello", "goodbye");
Expandir fragmento

Pero por lo demás, su ejemplo funciona bien ( arguments[0]se puede usar en lugar callbackdel probador)

Simon Scarfe avatar Aug 11 '2010 13:08 Simon Scarfe

Esto también funcionaría:

// callback function
function tryMe(param1, param2) {
  alert(param1 + " and " + param2);
}

// callback executer 
function callbackTester(callback) {
  callback();
}

// test function
callbackTester(function() {
  tryMe("hello", "goodbye");
});
Expandir fragmento

Otro escenario:

// callback function
function tryMe(param1, param2, param3) {
  alert(param1 + " and " + param2 + " " + param3);
}

// callback executer 
function callbackTester(callback) {
  //this is the more obivous scenario as we use callback function
  //only when we have some missing value
  //get this data from ajax or compute
  var extraParam = "this data was missing";

  //call the callback when we have the data
  callback(extraParam);
}

// test function
callbackTester(function(k) {
  tryMe("hello", "goodbye", k);
});
Expandir fragmento

Marimuthu Madasamy avatar Aug 11 '2010 13:08 Marimuthu Madasamy

Tu pregunta no está clara. Si se pregunta cómo puede hacer esto de una manera más sencilla, debería echar un vistazo al método .bind() de la quinta edición de ECMAScript , que es miembro de Function.prototype . Al usarlo, puedes hacer algo como esto:

function tryMe (param1, param2) {
    alert (param1 + " and " + param2);
}

function callbackTester (callback) {
    callback();
}

callbackTester(tryMe.bind(null, "hello", "goodbye"));

También puedes usar el siguiente código, que agrega el método si no está disponible en el navegador actual:

// From Prototype.js
if (!Function.prototype.bind) { // check if native implementation available
  Function.prototype.bind = function(){ 
    var fn = this, args = Array.prototype.slice.call(arguments),
        object = args.shift(); 
    return function(){ 
      return fn.apply(object, 
        args.concat(Array.prototype.slice.call(arguments))); 
    }; 
  };
}

Ejemplo

bind() - Documentación de PrototypeJS

Andy E avatar Aug 11 '2010 13:08 Andy E

Si no está seguro de cuántos parámetros se le pasarán a las funciones de devolución de llamada, utilice applyla función.

function tryMe (param1, param2) {
  alert (param1 + " and " + param2);
}

function callbackTester(callback,params){
    callback.apply(this,params);
}

callbackTester(tryMe,['hello','goodbye']);
Zeeman Chen avatar Apr 05 '2018 19:04 Zeeman Chen

Cuando tiene una devolución de llamada que será llamada por algo que no sea su código con un número específico de parámetros y desea pasar parámetros adicionales, puede pasar una función contenedora como devolución de llamada y dentro del contenedor pasar los parámetros adicionales.

function login(accessedViaPopup) {
    //pass FB.login a call back function wrapper that will accept the
    //response param and then call my "real" callback with the additional param
    FB.login(function(response){
        fb_login_callback(response,accessedViaPopup);
    });
}

//handles respone from fb login call
function fb_login_callback(response, accessedViaPopup) {
    //do stuff
}
Blake Mills avatar Sep 18 '2013 22:09 Blake Mills