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 .postfungsi 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 extraStuffdilewatkan sebagai argumen untuk doSomethingitu berada dalam lingkup doSomethingfungsi.
Ketika extraStuffdireferensikan dalam fungsi batin anonim yang dikembalikan doSomethingitu terikat oleh penutupan dengan extraStuffargumen fungsi luar itu . Ini benar bahkan setelah doSomethingkembali.
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.