Die Lösung ist die Bindung von Variablen durch Schließen.
Als grundlegenderes Beispiel finden Sie hier eine Beispielfunktion, die eine Rückruffunktion empfängt und aufruft, sowie eine beispielhafte Rückruffunktion:
function callbackReceiver(callback) {
callback("Hello World");
}
function callback(value1, value2) {
console.log(value1, value2);
}
Dies ruft den Rückruf auf und liefert ein einzelnes Argument. Jetzt möchten Sie ein zusätzliches Argument angeben, sodass Sie den Rückruf zum Abschluss bringen.
callbackReceiver(callback); // "Hello World", undefined
callbackReceiver(function(value) {
callback(value, "Foo Bar"); // "Hello World", "Foo Bar"
});
Oder einfacher mit ES6-Pfeilfunktionen :
callbackReceiver(value => callback(value, "Foo Bar")); // "Hello World", "Foo Bar"
In Ihrem speziellen Beispiel habe ich die .postFunktion in jQuery nicht verwendet , aber ein kurzer Scan der Dokumentation legt nahe, dass der Rückruf ein Funktionszeiger mit der folgenden Signatur sein sollte:
function callBack(data, textStatus, jqXHR) {};
Daher denke ich, dass die Lösung wie folgt lautet:
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");
};
Was ist los?
In der letzten Zeile doSomething(extraStuff)wird aufgerufen und das Ergebnis dieses Aufrufs ist ein Funktionszeiger .
Weil extraStuffals Argument übergeben wird, doSomethingliegt im Rahmen der doSomethingFunktion.
Wenn extraStuffin der zurückgegebenen anonymen inneren Funktion darauf verwiesen doSomethingwird, ist dies durch Schließen an das extraStuffArgument der äußeren Funktion gebunden . Dies gilt auch nach doSomethingder Rückkehr.
Ich habe das oben genannte nicht getestet, aber ich habe in den letzten 24 Stunden sehr ähnlichen Code geschrieben und er funktioniert wie beschrieben.
Sie können natürlich mehrere Variablen anstelle eines einzelnen 'extraStuff'-Objekts übergeben, abhängig von Ihren persönlichen Vorlieben / Codierungsstandards.