Решением является привязка переменных через замыкание.
В качестве более простого примера, вот пример функции, которая получает и вызывает функцию обратного вызова, а также пример функции обратного вызова:
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 в зависимости от ваших личных предпочтений / стандартов кодирования.