ใน JavaScript การชี้นี้มีการเปลี่ยนแปลงแบบไดนามิกและมีแนวโน้มว่าการชี้นี้จะถูกทำลายโดยไม่ตั้งใจในระหว่างกระบวนการเขียนโปรแกรม ดังนั้นเราต้องใช้เทคโนโลยีที่สามารถแก้ไขความหมายของสิ่งนี้ได้ดังนั้นเราจึงมีสามวิธี: การโทรใช้และผูกเพื่อเปลี่ยนจุดนี้ภายในร่างกายฟังก์ชั่นเพราะฟังก์ชั่นมีแนวคิดของ "บริบทคำจำกัดความ", "บริบทรันไทม์" และ "บริบทสามารถเปลี่ยนแปลงได้"
สมัครโทร
ใช้: ใช้วิธีหนึ่งของวัตถุบางอย่างและแทนที่วัตถุปัจจุบันด้วยวัตถุอื่น
โทร: เรียกวิธีการของวัตถุเพื่อแทนที่วัตถุปัจจุบันด้วยวัตถุอื่น
ฟังก์ชั่นบุคคล () {} person.prototype = {attr: {อายุ: 18, เพศ: 'girl'}, พูด: function () {console.log ("อายุของฉันคือ" + this.attr.age); console.log ("ฉันเป็น" + this.attr.sex); }} var marry = บุคคลใหม่ (); marry.say (); // อายุของฉันอายุ 18 // ฉันเป็นผู้หญิงเปลี่ยนทิศทาง
ฟังก์ชั่นบุคคล () {} person.prototype = {attr: {อายุ: 18, เพศ: 'girl'}, พูด: function () {console.log ("อายุของฉันคือ" + this.attr.age); console.log ("ฉันเป็น" + this.attr.sex); }} xiaoming = {attr: {อายุ: 20, เพศ: 'boy'}}; var marry = คนใหม่ (); marry.say (); marry.say.call (xiaoming); // อายุของฉันอายุ 18 // ฉันเป็นผู้หญิง // อายุของฉันคือ 20 // ฉันเป็นเด็กผู้ชายสิ่งที่เป็นเรื่องธรรมดา
ทั้งสองสามารถใช้เรียกวิธีการแทนวัตถุอื่นเปลี่ยนบริบทวัตถุของฟังก์ชันจากบริบทเริ่มต้นเป็นวัตถุใหม่ที่ระบุโดย Thisobj
ความแตกต่าง
1. ใช้: มีเพียงสองพารามิเตอร์มากที่สุด - วัตถุใหม่นี้และอาร์เรย์ Argarray หากคุณผ่านพารามิเตอร์หลายตัวไปยังวิธีนี้ให้เขียนพารามิเตอร์ทั้งหมดลงในอาร์เรย์นี้ แน่นอนแม้ว่าจะมีพารามิเตอร์เพียงหนึ่งพารามิเตอร์ก็จะต้องเขียนลงในอาร์เรย์ หาก Argarray ไม่ใช่อาร์เรย์ที่ถูกต้องหรือไม่ใช่วัตถุอาร์กิวเมนต์ประเภท TypeError จะถูกสร้างขึ้น หากไม่มีการให้ข้อโต้แย้งวัตถุทั่วโลกจะถูกใช้เป็น thisobj และไม่สามารถผ่านข้อโต้แย้งใด ๆ ได้
fun.call (thisarg [, arg1 [, arg2 [, ... ]]]) ฟังก์ชั่น f (x, y) {console.log (x+y);} f.call (null, 1, 1) // return 22. การโทร: มันเป็นรายการพารามิเตอร์โดยตรงซึ่งส่วนใหญ่จะใช้เมื่อวิธีการต่าง ๆ ของวัตถุ JS ถูกเรียกให้กันและกันเพื่อให้ตัวชี้ปัจจุบันยังคงสอดคล้องกันหรือในกรณีพิเศษตัวชี้นี้จะต้องเปลี่ยน หากไม่มีการจัดเตรียมพารามิเตอร์ ThisOBJ วัตถุส่วนกลางจะถูกใช้เป็น ThisObj
fun.apply (thisarg, [argsarray]) ฟังก์ชั่น f (x, y) {console.log (x+y);} f.call (null, [1,1]) // return 2ใช้เป็นเช่นเดียวกับฟังก์ชั่นการโทรยกเว้นว่ารายการพารามิเตอร์ขาเข้าจะแตกต่างกันในรูปแบบ นี่คือบริบทที่คุณต้องการระบุ มันอาจเป็นวัตถุ JavaScript ใด ๆ (ทุกอย่างใน JavaScript เป็นวัตถุ) การโทรต้องผ่านพารามิเตอร์ตามลำดับในขณะที่ใช้พารามิเตอร์วางในอาร์เรย์
หากจำนวนพารามิเตอร์ของฟังก์ชั่นไม่ได้รับการแก้ไขให้ใช้การโทรเมื่อพารามิเตอร์ของคุณทราบปริมาณอย่างชัดเจนและใช้เมื่อมันไม่แน่นอนแล้วกดพารามิเตอร์ลงในอาร์เรย์และส่งผ่านเมื่อจำนวนพารามิเตอร์ไม่แน่นอนฟังก์ชั่นสามารถสำรวจพารามิเตอร์ทั้งหมดผ่านอาร์เรย์อาร์กิวเมนต์ มาดูการใช้งานกันบ้าง
รหัส 1
var array1 = [12, "foo", {ชื่อ: "Joe"}, -2458]; var array2 = ["doe", 555, 100]; array.prototype.push.apply (array1, array2); console.log (array1);รหัสสอง
var numbers = [5, 458, 120, -215]; math.max.apply (null, ตัวเลข); // 458
รหัสสาม
บันทึก (12, "foo", {ชื่อ: "Joe"}, -2458); ฟังก์ชั่น log () {var args = array.prototype.slice.call (อาร์กิวเมนต์); args.unshift ('(แอป)'); console.log.apply (คอนโซล, args);}; // (แอพ) 12 วัตถุ foo {ชื่อ: "Joe"} -2458ผูก
fun.bind (thisarg [, arg1 [, arg2 [, ... ]]]])
ซึ่งแตกต่างจากข้างต้นการผูกจะส่งคืนฟังก์ชั่นใหม่ที่เปลี่ยนการชี้นี้ โปรดทราบว่าฟังก์ชั่นใหม่นั้นเน้นที่นี่ซึ่งไม่ใช่ที่อยู่หน่วยความจำเดียวกับที่ใช้มาก่อนดังนั้นเมื่อคุณต้องการนำฟังก์ชั่นนี้กลับมาใช้ใหม่คุณต้องบันทึกลงในตัวแปรเพื่ออำนวยความสะดวกในการโทรครั้งต่อไป ฟังก์ชั่นสองฟังก์ชั่นข้างต้นคือผลลัพธ์การดำเนินการที่ส่งคืนนั่นคือการโทรจะถูกเรียกใช้งาน
นอกจากนี้แถวอื่น ๆ ที่ควรทราบคือพารามิเตอร์แรกในฟังก์ชั่นการผูกจะกลายเป็นค่าเริ่มต้นโดยอัตโนมัติสำหรับการส่งคืนพารามิเตอร์ในฟังก์ชันใหม่ จากนั้นเมื่อมีการเรียกการโทรอย่างเป็นทางการคุณจะต้องให้พารามิเตอร์ที่เหลือยกเว้นพารามิเตอร์แรก
ฟังก์ชั่น f (x, y) {console.log (x+y);} f.call (null, [1,1]) var new_f = f.bind (null, 1,1) // return functionnew_f ใหม่ (1) // return 2ควรสังเกตว่าพารามิเตอร์นี้ในรหัสตัวอย่างข้างต้นทั้งหมดจะถูกแทนที่ด้วย NULL เมื่อไม่ได้ระบุวัตถุนี้การชี้นี้เป็นวัตถุระดับโลกภายใต้ null และไม่ได้กำหนดนั่นคือสภาพแวดล้อมการดำเนินการรหัส JS
สมัครโทรผูกมัดการเปรียบเทียบ
var obj = {bar: 'อ๊ะนี่เป็นความคิดที่ไม่ดี'}; var foo = {get: function () {return this.bar; }} var bind = foo.get.bind (obj), call = foo.get.call (obj), ใช้ = foo.get.apply (obj); console.log (bind (), โทร, สมัคร); console.log (ผูก, โทร, สมัคร); console.log (typeof bind, typeof call, typeof apple); console.log (typeof bind (), typeof call, typeof apple);ฉันไม่เห็นความแตกต่าง ความแตกต่างคือเมื่อคุณต้องการเปลี่ยนบริบทมันจะไม่ถูกดำเนินการทันที แต่การเรียกกลับจะใช้วิธีการ bind () ใช้/โทรจะเรียกใช้ฟังก์ชันทันที
ใช้การโทรผูกทั้งหมดจะใช้เพื่อเปลี่ยนการชี้ของวัตถุนี้ของฟังก์ชัน พารามิเตอร์แรกของการใช้งานการโทรผูกเป็นวัตถุทั้งหมดที่ควรชี้นั่นคือบริบทที่จะระบุ; ใช้การโทรผูกสามารถใช้พารามิเตอร์ที่ตามมาเพื่อผ่านพารามิเตอร์ BIND ส่งคืนฟังก์ชั่นที่สอดคล้องกันซึ่งสะดวกสำหรับการโทรในภายหลัง สมัครโทรถูกเรียกทันที
บทความข้างต้นเข้าใจถึงความแตกต่างระหว่างวิธีการเรียกใช้และการผูกใน JavaScript เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่ามันจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น