Rozwiązaniem jest wiązanie zmiennych poprzez zamknięcie.
Jako bardziej podstawowy przykład, oto przykładowa funkcja, która odbiera i wywołuje funkcję zwrotną, a także przykładową funkcję zwrotną:
function callbackReceiver(callback) {
callback("Hello World");
}
function callback(value1, value2) {
console.log(value1, value2);
}
To wywołuje wywołanie zwrotne i podaje pojedynczy argument. Teraz chcesz podać dodatkowy argument, więc zamknij wywołanie zwrotne.
callbackReceiver(callback); // "Hello World", undefined
callbackReceiver(function(value) {
callback(value, "Foo Bar"); // "Hello World", "Foo Bar"
});
Lub, po prostu, używając ES6 Funkcje strzałek :
callbackReceiver(value => callback(value, "Foo Bar")); // "Hello World", "Foo Bar"
Jeśli chodzi o konkretny przykład, nie użyłem tej .post
funkcji w jQuery, ale szybki skan dokumentacji sugeruje, że wywołanie zwrotne powinno być wskaźnikiem funkcji o następującej sygnaturze:
function callBack(data, textStatus, jqXHR) {};
Dlatego myślę, że rozwiązanie jest następujące:
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");
};
Co się dzieje?
W ostatnim wierszu doSomething(extraStuff)
jest wywoływany, a wynikiem tego wywołania jest wskaźnik funkcji .
Ponieważ extraStuff
jest przekazywany jako argument, należy do doSomething
zakresu doSomething
funkcji.
Gdy extraStuff
jest odwołany w zwróconej anonimowej funkcji wewnętrznej doSomething
, jest związany przez zamknięcie extraStuff
argumentu funkcji zewnętrznej . Dzieje się tak nawet po doSomething
powrocie.
Nie testowałem powyższego, ale napisałem bardzo podobny kod w ciągu ostatnich 24 godzin i działa tak, jak to opisałem.
Możesz oczywiście przekazać wiele zmiennych zamiast jednego obiektu „extraStuff” w zależności od osobistych preferencji / standardów kodowania.