Рішенням є зв'язування змінних через закриття.
Як більш базовий приклад, ось приклад функції, яка приймає та викликає функцію зворотного дзвінка, а також приклад функції зворотного виклику:
function callbackReceiver(callback) {
callback("Hello World");
}
function callback(value1, value2) {
console.log(value1, value2);
}
Це викликає зворотний виклик і надає один аргумент. Тепер ви хочете надати додатковий аргумент, тому ви завершуєте зворотний виклик.
callbackReceiver(callback); // "Hello World", undefined
callbackReceiver(function(value) {
callback(value, "Foo Bar"); // "Hello World", "Foo Bar"
});
Або, простіше, використовуючи функції стрілок ES6 :
callbackReceiver(value => callback(value, "Foo Bar")); // "Hello World", "Foo Bar"
Що стосується вашого конкретного прикладу, я не використовував цю .post
функцію в jQuery, але швидке сканування документації дозволяє припустити, що зворотний дзвінок повинен бути покажчиком функції із такою підписом:
function callBack(data, textStatus, jqXHR) {};
Тому я думаю, що рішення таке:
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");
};
Що відбувається?
В останньому рядку, doSomething(extraStuff)
буде викликаний і результатом цього виклику є покажчиком на функцію .
Оскільки extraStuff
передається як аргумент, doSomething
він знаходиться в межах doSomething
функції.
Коли на extraStuff
нього посилається повернута анонімна внутрішня функція, doSomething
вона пов'язана із закриттям на extraStuff
аргумент зовнішньої функції . Це вірно навіть після того, doSomething
як повернувся.
Я не перевіряв вищезазначене, але я написав дуже подібний код за останні 24 години, і він працює так, як я описав.
Звичайно, ви можете передавати кілька змінних замість одного об'єкта 'extraStuff' залежно від ваших особистих уподобань / стандартів кодування.