เป็นไปได้ไหมที่จะส่งผ่านฟังก์ชัน javascript ที่มีพารามิเตอร์เป็นพารามิเตอร์?
ตัวอย่าง:
$(edit_link).click( changeViewMode( myvar ) );
เป็นไปได้ไหมที่จะส่งผ่านฟังก์ชัน javascript ที่มีพารามิเตอร์เป็นพารามิเตอร์?
ตัวอย่าง:
$(edit_link).click( changeViewMode( myvar ) );
คำตอบ:
ใช้ "การปิด":
$(edit_link).click(function(){ return changeViewMode(myvar); });
สิ่งนี้จะสร้าง wrapper ฟังก์ชันชั่วคราวแบบไม่ระบุชื่อที่รู้เกี่ยวกับพารามิเตอร์และส่งผ่านไปยังการประยุกต์ใช้การโทรกลับจริง
this.myFunction = this.myFunction.bind(this)ของคุณconstructorแทน แต่อย่างที่คุณพูดเมื่อคุณต้องผ่านบริบทที่แตกต่างกันไปสำหรับแต่ละคนเช่นแถวต่างๆที่คุณคลิกเพื่อเปิดหน้ารายละเอียดของแถวนั้นมันไม่สามารถหลีกเลี่ยงได้
Function.prototype.bind()ใช้ การอ้างอิง MDN:
bind()วิธีการสร้างฟังก์ชั่นใหม่ที่เรียกว่าเมื่อมีของthisชุดคำหลักเพื่อให้คุ้มค่ากับการให้ลำดับของการขัดแย้งก่อนหน้านี้ที่ให้บริการใด ๆ เมื่อฟังก์ชั่นใหม่ที่เรียกว่า
ได้รับการสนับสนุนโดยเบราว์เซอร์หลักทั้งหมดรวมถึง IE9 +
รหัสของคุณควรมีลักษณะเช่นนี้:
$(edit_link).click(changeViewMode.bind(null, myvar));
หมายเหตุด้านข้าง: ฉันคิดว่าคุณอยู่ในบริบทโลกเช่นthisตัวแปรคือwindow; มิฉะนั้นใช้แทนthisnull
$.ajax(url).done(handler.bind(this, var1, var2));
ไม่ แต่คุณสามารถผ่านได้โดยไม่มีพารามิเตอร์และทำสิ่งนี้:
$(edit_link).click(
function() { changeViewMode(myvar); }
);
ดังนั้นคุณจะผ่านฟังก์ชั่นนิรนามโดยไม่มีพารามิเตอร์จากนั้นฟังก์ชั่นนั้นจะเรียกใช้ฟังก์ชั่นที่กำหนดพารามิเตอร์ของคุณพร้อมกับตัวแปรในการปิด
ใช่เช่นนี้
$(edit_link).click(function() { changeViewMode(myvar) });
หรือถ้าคุณใช้ es6 คุณควรจะสามารถใช้ฟังก์ชั่นลูกศรได้
$(edit_link).click(() => changeViewMode(myvar));
คุณสามารถทำได้
var message = 'Hello World';
var callback = function(){
alert(this)
}.bind(message);
แล้ว
function activate(callback){
callback && callback();
}
activate(callback);
หรือถ้าโทรกลับของคุณมีตรรกะที่ยืดหยุ่นมากขึ้นคุณสามารถส่งผ่านวัตถุ
นี่คือตัวอย่างต่อไปนี้แนวทางของ Ferdinand Beyer:
function function1()
{
function2(function () { function3("parameter value"); });
}
function function2(functionToBindOnClick)
{
$(".myButton").click(functionToBindOnClick);
}
function function3(message) { alert(message); }
ในตัวอย่างนี้ "ค่าพารามิเตอร์" ถูกส่งผ่านจาก function1 ถึง function3 ถึง function2 โดยใช้ฟังก์ชันการตัด