Çözüm, değişkenlerin kapanma yoluyla bağlanmasıdır.
Daha temel bir örnek olarak, burada bir geri arama işlevi alan ve çağıran bir örnek işlevin yanı sıra örnek bir geri arama işlevi verilmiştir:
function callbackReceiver(callback) {
callback("Hello World");
}
function callback(value1, value2) {
console.log(value1, value2);
}
Bu geri çağrıyı çağırır ve tek bir argüman sağlar. Şimdi ek bir argüman sunmak istersiniz, böylece geri aramayı kapatırsınız.
callbackReceiver(callback); // "Hello World", undefined
callbackReceiver(function(value) {
callback(value, "Foo Bar"); // "Hello World", "Foo Bar"
});
Veya daha basit bir şekilde ES6 Ok Fonksiyonlarını kullanarak :
callbackReceiver(value => callback(value, "Foo Bar")); // "Hello World", "Foo Bar"
Özel örneğinize gelince, .post
işlevi jQuery'de kullanmadım, ancak belgelerin hızlı bir şekilde taranması, geri aramanın aşağıdaki imzalı bir işlev işaretçisi olması gerektiğini gösteriyor :
function callBack(data, textStatus, jqXHR) {};
Bu nedenle çözümün şöyle olduğunu düşünüyorum:
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");
};
Ne oluyor?
Son satırında, doSomething(extraStuff)
bir çağrılan ve çağırma sonucu meydana gelir işlev işaretçisi .
Çünkü extraStuff
bir argüman olarak geçilirse fonksiyonun doSomething
kapsamı içindedir doSomething
.
Geri extraStuff
döndürülen anonim iç işlevinde ne zaman başvurulursa doSomething
, dış işlevin extraStuff
bağımsız değişkenine kapanarak bağlanır . Bu, doSomething
geri döndükten sonra bile geçerlidir .
Yukarıdakileri test etmedim, ancak son 24 saat içinde çok benzer bir kod yazdım ve tarif ettiğim gibi çalışıyor.
Kişisel tercihinize / kodlama standartlarınıza bağlı olarak tek bir 'extraStuff' nesnesi yerine elbette birden fazla değişkeni iletebilirsiniz.