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 .postfonction 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 extraStuffest passé en argument, doSomethingil est dans le cadre de la doSomethingfonction.
Lorsque extraStuffest référencé dans la fonction interne anonyme retournée, doSomethingil est lié par la fermeture à l' extraStuffargument de la fonction externe . Cela est vrai même après doSomethingson 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.