解決策は、クロージャーによる変数のバインディングです。
より基本的な例として、コールバック関数を受信して呼び出す関数の例と、コールバック関数の例を次に示します。
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」オブジェクトの代わりに複数の変数を渡すことができます。