A solução é a ligação de variáveis através do fechamento.
Como um exemplo mais básico, aqui está um exemplo de função que recebe e chama uma função de retorno de chamada, bem como uma função de retorno de chamada de exemplo:
function callbackReceiver(callback) {
callback("Hello World");
}
function callback(value1, value2) {
console.log(value1, value2);
}
Isso chama o retorno de chamada e fornece um único argumento. Agora você deseja fornecer um argumento adicional, para encerrar o retorno de chamada.
callbackReceiver(callback); // "Hello World", undefined
callbackReceiver(function(value) {
callback(value, "Foo Bar"); // "Hello World", "Foo Bar"
});
Ou, mais simplesmente, usando as funções de seta do ES6 :
callbackReceiver(value => callback(value, "Foo Bar")); // "Hello World", "Foo Bar"
Quanto ao seu exemplo específico, eu não usei a .post
função no jQuery, mas uma rápida verificação da documentação sugere que a chamada de retorno deve ser um ponteiro de função com a seguinte assinatura:
function callBack(data, textStatus, jqXHR) {};
Portanto, acho que a solução é a seguinte:
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");
};
O que está acontecendo?
Na última linha, doSomething(extraStuff)
é invocado e o resultado dessa invocação é um ponteiro de função .
Porque extraStuff
é passado como argumento para doSomething
ele, está dentro do escopo da doSomething
função.
Quando extraStuff
é referenciado na função interna anônima retornada doSomething
, é vinculado pelo fechamento do extraStuff
argumento da função externa . Isso é verdade mesmo após o doSomething
retorno.
Não testei o acima, mas escrevi um código muito semelhante nas últimas 24 horas e funciona como descrevi.
É claro que você pode passar várias variáveis em vez de um único objeto 'extraStuff', dependendo de suas preferências pessoais / padrões de codificação.