La solución es la unión de variables a través del cierre.
Como un ejemplo más básico, aquí hay una función de ejemplo que recibe y llama a una función de devolución de llamada, así como una función de devolución de llamada de ejemplo:
function callbackReceiver(callback) {
callback("Hello World");
}
function callback(value1, value2) {
console.log(value1, value2);
}
Esto llama a la devolución de llamada y proporciona un único argumento. Ahora desea proporcionar un argumento adicional, de modo que cierre la devolución de llamada.
callbackReceiver(callback); // "Hello World", undefined
callbackReceiver(function(value) {
callback(value, "Foo Bar"); // "Hello World", "Foo Bar"
});
O, más simplemente, usando las funciones de flecha ES6 :
callbackReceiver(value => callback(value, "Foo Bar")); // "Hello World", "Foo Bar"
En cuanto a su ejemplo específico, no he usado la .post
función en jQuery, pero un análisis rápido de la documentación sugiere que la devolución de llamada debería ser un puntero de función con la siguiente firma:
function callBack(data, textStatus, jqXHR) {};
Por lo tanto, creo que la solución es la siguiente:
var doSomething = function(extraStuff) {
return function(data, textStatus, jqXHR) {
// do something with extraStuff
};
};
var clicked = function() {
var extraStuff = {
myParam1: 'foo',
myParam2: 'bar'
}; // an object / whatever extra params you wish to pass.
$.post("someurl.php", someData, doSomething(extraStuff), "json");
};
¿Qué está pasando?
En la última línea, doSomething(extraStuff)
se invoca y el resultado de esa invocación es un puntero de función .
Porque extraStuff
se pasa como un argumento doSomething
está dentro del alcance de la doSomething
función.
Cuando extraStuff
se hace referencia en la función interna anónima devuelta doSomething
, está vinculada por el cierre al extraStuff
argumento de la función externa . Esto es cierto incluso después de que doSomething
haya regresado.
No he probado lo anterior, pero he escrito un código muy similar en las últimas 24 horas y funciona como lo describí.
Por supuesto, puede pasar múltiples variables en lugar de un solo objeto 'extraStuff' dependiendo de sus preferencias personales / estándares de codificación.