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