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 .post
Funktion 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 extraStuff
als Argument übergeben wird, doSomething
liegt im Rahmen der doSomething
Funktion.
Wenn extraStuff
in der zurückgegebenen anonymen inneren Funktion darauf verwiesen doSomething
wird, ist dies durch Schließen an das extraStuff
Argument der äußeren Funktion gebunden . Dies gilt auch nach doSomething
der 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.