JavaScript: pasar parámetros a una función de devolución de llamada
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");
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");
Pero por lo demás, su ejemplo funciona bien ( arguments[0]
se puede usar en lugar callback
del probador)
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");
});
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);
});
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
Si no está seguro de cuántos parámetros se le pasarán a las funciones de devolución de llamada, utilice apply
la función.
function tryMe (param1, param2) {
alert (param1 + " and " + param2);
}
function callbackTester(callback,params){
callback.apply(this,params);
}
callbackTester(tryMe,['hello','goodbye']);
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
}