La soluzione è il legame delle variabili attraverso la chiusura.
Come esempio più semplice, ecco una funzione di esempio che riceve e chiama una funzione di callback, così come una funzione di callback di esempio:
function callbackReceiver(callback) {
callback("Hello World");
}
function callback(value1, value2) {
console.log(value1, value2);
}
Ciò chiama la richiamata e fornisce un singolo argomento. Ora vuoi fornire un argomento aggiuntivo, quindi concludi il callback.
callbackReceiver(callback);
callbackReceiver(function(value) {
callback(value, "Foo Bar");
});
O, più semplicemente usando le funzioni freccia ES6 :
callbackReceiver(value => callback(value, "Foo Bar"));
Per quanto riguarda il tuo esempio specifico, non ho usato la .post
funzione in jQuery, ma una rapida scansione della documentazione suggerisce che la richiamata dovrebbe essere un puntatore a funzione con la seguente firma:
function callBack(data, textStatus, jqXHR) {};
Pertanto penso che la soluzione sia la seguente:
var doSomething = function(extraStuff) {
return function(data, textStatus, jqXHR) {
};
};
var clicked = function() {
var extraStuff = {
myParam1: 'foo',
myParam2: 'bar'
};
$.post("someurl.php", someData, doSomething(extraStuff), "json");
};
Che cosa sta succedendo?
Nell'ultima riga, doSomething(extraStuff)
viene richiamato e il risultato di tale invocazione è un puntatore a funzione .
Perché extraStuff
viene passato come argomento ad doSomething
esso rientra nell'ambito della doSomething
funzione.
Quando extraStuff
viene fatto riferimento nella funzione interna anonima restituita doSomething
, è vincolato dalla chiusura extraStuff
all'argomento della funzione esterna . Questo è vero anche dopo che doSomething
è tornato.
Non ho testato quanto sopra, ma ho scritto un codice molto simile nelle ultime 24 ore e funziona come ho descritto.
Ovviamente puoi passare più variabili invece di un singolo oggetto 'extraStuff' a seconda delle tue preferenze personali / standard di codifica.