La solution est la liaison des variables par la fermeture.
Comme exemple plus basique, voici un exemple de fonction qui reçoit et appelle une fonction de rappel, ainsi qu'un exemple de fonction de rappel:
function callbackReceiver(callback) {
callback("Hello World");
}
function callback(value1, value2) {
console.log(value1, value2);
}
Cela appelle le rappel et fournit un seul argument. Maintenant, vous voulez fournir un argument supplémentaire, vous devez donc boucler le rappel en fermeture.
callbackReceiver(callback); // "Hello World", undefined
callbackReceiver(function(value) {
callback(value, "Foo Bar"); // "Hello World", "Foo Bar"
});
Ou, plus simplement en utilisant les fonctions fléchées ES6 :
callbackReceiver(value => callback(value, "Foo Bar")); // "Hello World", "Foo Bar"
Quant à votre exemple spécifique, je n'ai pas utilisé la .post
fonction dans jQuery, mais une analyse rapide de la documentation suggère que le rappel devrait être un pointeur de fonction avec la signature suivante:
function callBack(data, textStatus, jqXHR) {};
Je pense donc que la solution est la suivante:
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-ce qui se passe?
Dans la dernière ligne, doSomething(extraStuff)
est invoqué et le résultat de cette invocation est un pointeur de fonction .
Parce qu'il extraStuff
est passé en argument, doSomething
il est dans le cadre de la doSomething
fonction.
Lorsque extraStuff
est référencé dans la fonction interne anonyme retournée, doSomething
il est lié par la fermeture à l' extraStuff
argument de la fonction externe . Cela est vrai même après doSomething
son retour.
Je n'ai pas testé ce qui précède, mais j'ai écrit un code très similaire au cours des dernières 24 heures et cela fonctionne comme je l'ai décrit.
Vous pouvez bien sûr transmettre plusieurs variables au lieu d'un seul objet «extraStuff» en fonction de vos préférences personnelles / normes de codage.