Solusinya adalah pengikatan variabel melalui penutupan.
Sebagai contoh yang lebih mendasar, berikut adalah contoh fungsi yang menerima dan memanggil fungsi panggilan balik, serta contoh fungsi panggilan balik:
function callbackReceiver(callback) {
callback("Hello World");
}
function callback(value1, value2) {
console.log(value1, value2);
}
Ini memanggil panggilan balik dan memasok satu argumen. Sekarang Anda ingin memberikan argumen tambahan, sehingga Anda menutup callback sebagai penutup.
callbackReceiver(callback); // "Hello World", undefined
callbackReceiver(function(value) {
callback(value, "Foo Bar"); // "Hello World", "Foo Bar"
});
Atau, lebih sederhana menggunakan Fungsi Panah ES6 :
callbackReceiver(value => callback(value, "Foo Bar")); // "Hello World", "Foo Bar"
Adapun contoh spesifik Anda, saya belum menggunakan .post
fungsi di jQuery, tetapi pemindaian cepat dokumentasi menunjukkan panggilan kembali harus menjadi penunjuk fungsi dengan tanda tangan berikut:
function callBack(data, textStatus, jqXHR) {};
Karena itu saya pikir solusinya adalah sebagai berikut:
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");
};
Apa yang terjadi?
Di baris terakhir, doSomething(extraStuff)
yang dipanggil dan hasil doa yang merupakan pointer fungsi .
Karena extraStuff
dilewatkan sebagai argumen untuk doSomething
itu berada dalam lingkup doSomething
fungsi.
Ketika extraStuff
direferensikan dalam fungsi batin anonim yang dikembalikan doSomething
itu terikat oleh penutupan dengan extraStuff
argumen fungsi luar itu . Ini benar bahkan setelah doSomething
kembali.
Saya belum menguji di atas, tetapi saya telah menulis kode yang sangat mirip dalam 24 jam terakhir dan berfungsi seperti yang saya jelaskan.
Anda tentu saja dapat melewati beberapa variabel, bukan objek 'ekstraStuff' tunggal tergantung pada preferensi pribadi Anda / standar pengkodean.