การแก้ปัญหาคือการเชื่อมโยงของตัวแปรผ่านการปิด
เป็นตัวอย่างพื้นฐานเพิ่มเติมนี่คือตัวอย่างฟังก์ชันที่รับและเรียกฟังก์ชัน callback รวมถึงตัวอย่างฟังก์ชัน callback:
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' เดียวโดยขึ้นอยู่กับความชอบส่วนตัว / มาตรฐานการเข้ารหัสของคุณ