หากคุณไม่เคยสัมผัสกับภาษาไดนามิกและเข้าใจ JavaScript ในความคิดภาษาที่รวบรวมได้คุณจะมีความรู้สึกมหัศจรรย์และแปลกประหลาดเพราะสิ่งที่มักเป็นไปไม่ได้ในการมีสติเกิดขึ้นและรู้สึกไม่มีเหตุผล หากคุณพบความรู้สึกนี้ในกระบวนการเรียนรู้ JavaScript ภาษาฟรีและไม่มีที่สิ้นสุดจากนั้นจากรูปแบบปัจจุบันโปรดปล่อย "อคติ" ของคุณเพราะนี่เป็นโลกใหม่สำหรับคุณให้ JavaScript ช้าลงอย่างช้าๆ
โอเคกลับไปที่จุดก่อนที่จะเข้าใจลักษณะบริบทของ Javascrtipt ที่เปลี่ยนแปลงแบบไดนามิกรันไทม์แบบไดนามิก คุณลักษณะนี้ส่วนใหญ่สะท้อนให้เห็นในการประยุกต์ใช้สองวิธีของการใช้และการโทร
หากต้องการแยกแยะการสมัครโทรในประโยคเดียว
foo.call (this, arg1, arg2, arg3) == foo.apply (นี่, อาร์กิวเมนต์) == this.foo (arg1, arg2, arg3)
การโทรและใช้ทั้งสองเป็นวิธีการของฟังก์ชัน prototype มันถูกนำไปใช้ภายในโดยเครื่องยนต์ JavaScript เพราะมันเป็นของฟังก์ชัน prototype แต่ละอินสแตนซ์วัตถุฟังก์ชันนั่นคือแต่ละวิธีมีการโทรและใช้แอตทริบิวต์ เนื่องจากมันเป็นคุณสมบัติของวิธีการการใช้งานของพวกเขาจึงมีจุดมุ่งหมายที่วิธีการ วิธีการทั้งสองนี้ง่ายต่อการสับสนเพราะมีฟังก์ชั่นเดียวกัน แต่ใช้แตกต่างกัน
ความคล้ายคลึงกัน: ผลกระทบของทั้งสองวิธีเหมือนกันทุกประการ
ความแตกต่าง: พารามิเตอร์ที่ส่งผ่านโดยวิธีการแตกต่างกัน
ดังนั้นผลกระทบของวิธีการคืออะไรและพารามิเตอร์ที่ส่งผ่านโดยวิธีการคืออะไร?
มาวิเคราะห์ foo.call ข้างต้น (นี่, arg1, arg2, arg3)
Foo เป็นวิธีการนี่เป็นวัตถุที่เกี่ยวข้องกับบริบทเมื่อวิธีการถูกดำเนินการ, Arg1, Arg2 และ Arg3 เป็นพารามิเตอร์ที่ส่งผ่านไปยังวิธี Foo วัตถุที่เกี่ยวข้องกับบริบทที่เรียกว่าเมื่อมีการดำเนินการวิธีการหากมีพื้นฐานการเขียนโปรแกรมเชิงวัตถุมันเป็นเรื่องง่ายที่จะเข้าใจมันเป็นสิ่งนี้ในวัตถุหลังคลาสอินสแตนซ์
ใน JavaScript รหัสจะมีวัตถุบริบทเสมอและรหัสจะประมวลผลภายใน วัตถุบริบทเป็นตัวเป็นตนโดยตัวแปรนี้ซึ่งชี้ไปที่วัตถุที่รหัสปัจจุบันอยู่เสมอ
เพื่อให้เข้าใจได้ดีขึ้นว่านี่คืออะไรให้ยกตัวอย่าง
/สร้างฟังก์ชันคลาส A A () {// รหัสต่อไปนี้จะทำงานเมื่อคลาสถูกสร้างอินสแตนซ์ // วัตถุบริบทการดำเนินการในเวลานี้คือสิ่งนี้ซึ่งเป็นวัตถุอินสแตนซ์ปัจจุบัน this.message = "ข้อความของ A"; this.getMessage = function () {<span style = "space สีขาว: pre"> </span> ส่งคืนสิ่งนี้ message; <span style = "space สีขาว: pre"> </span>}} // สร้างค่าคลาส A var a = new a (); การแจ้งเตือน (a.getMessage ()); // สร้างฟังก์ชันคลาส B B () {this.message = "ข้อความของ b"; this.setMessage = function (msg) {<span style = "White-space: pre"> </span> this.message = msg; <span style = "space สีขาว: pre"> </span>}} // สร้างวัตถุคลาส Bจะเห็นได้ว่าคลาส A และ B มีแอตทริบิวต์ข้อความ (ไปยังสมาชิกที่กล่าวถึงในวัตถุ) A มีวิธีการ getMessage เพื่อรับข้อความและ B มีวิธี setMessage ในการตั้งค่าข้อความ ต่อไปนี้คือการแสดงพลังของการโทร
// Dynamic กำหนดวิธีการ setMessage ของ B ให้กับวัตถุ โปรดทราบว่าตัวเองไม่มีวิธีนี้! b.setMessage.call (a, "ข้อความของ A"); // ทั้งหมดแสดงการแจ้งเตือน "ข้อความของ A" (A.getMessage ()); // Dynamic กำหนดวิธี getMessage ของ A ถึงวัตถุ B โปรดทราบว่า B ตัวเองไม่มีวิธีนี้!
นี่คือพลังของการโทร JavaScript ภาษาแบบไดนามิก!
มันเป็นเพียง "การสร้างบางสิ่งบางอย่างโดยไม่มีอะไร" วิธีการของวัตถุสามารถกำหนดโดยพลการ แต่วัตถุนั้นไม่เคยมีวิธีนี้ โปรดทราบว่าเป็นการมอบหมาย ในแง่ของ Layman วิธีนี้คือการให้ยืมวัตถุอื่นเพื่อทำงานให้เสร็จ โดยหลักการแล้ววัตถุบริบทจะเปลี่ยนไปเมื่อวิธีการ
ดังนั้น b.setMessage.call (a, "ข้อความของ A"); เทียบเท่ากับการใช้ AS วัตถุบริบทเพื่อเรียกวิธีการ setMessage ของวัตถุ B เมื่อดำเนินการและกระบวนการนี้ไม่มีความสัมพันธ์กับ B และผลกระทบของมันเทียบเท่ากับ A.SetMessage ("ข้อความของ A");
เนื่องจากผลของการสมัครและการโทรเหมือนกันจึงสามารถกล่าวได้ว่า
การโทรใช้ฟังก์ชันคือการยืมวิธีการโทรของคนอื่นเช่นเดียวกับการโทรของตัวเอง
ตกลงหลังจากทำความเข้าใจความคล้ายคลึงกันระหว่างการโทรและการสมัคร - หลังจากเข้าใจพวกเขาลองมาดูความแตกต่างของพวกเขา หลังจากดูตัวอย่างข้างต้นฉันเชื่อว่าคุณรู้เรื่องนี้
จาก b.setMessage.call (a,“ ข้อความของ A”) เทียบเท่ากับ A.SetMessage (“ ข้อความของ A”) จะเห็นได้ว่า“ ข้อความของ A” ถูกส่งผ่านเป็นพารามิเตอร์ในการโทร
ดังนั้นมันหมายถึงการสมัครอย่างไร? เป็นการยากที่จะอธิบายอย่างชัดเจน ต้องใช้ร่วมกับสถานการณ์แอปพลิเคชันเพื่อให้ชัดเจนอย่างรวดเร็ว มาออกแบบสถานการณ์แอปพลิเคชัน:
ฟังก์ชั่นการพิมพ์ (a, b, c, d) {การแจ้งเตือน (a + b + c + d);} ตัวอย่างฟังก์ชั่น (a, b, c, d) {// ยืมพิมพ์ในวิธีการโทรและกระจายพารามิเตอร์อย่างชัดเจนเพื่อผ่านการพิมพ์ พิมพ์โดยตรง apply (สิ่งนี้, อาร์กิวเมนต์); // หรือห่อหุ้มมันลงในอาร์เรย์ print.apply (สิ่งนี้, [a, b, c, d]);} // "สคริปต์ backlit" ตัวอย่าง ("กลับ", "แสง", "เท้า", "this"););ในสถานการณ์นี้ในวิธีการตัวอย่าง A, B, C, D ถูกใช้เป็นพารามิเตอร์ที่ส่งผ่านโดยวิธีการและวิธีการใช้และการเรียกใช้เพื่อยืมวิธีการพิมพ์เพื่อโทร
ในประโยคสุดท้ายเนื่องจากวิธีการตัวอย่างเรียกโดยตรงวัตถุบริบทในวิธีนี้เป็นวัตถุหน้าต่าง
ดังนั้นยกเว้นพารามิเตอร์แรกนั่นคือวัตถุบริบทจะเหมือนกันเมื่อดำเนินการพารามิเตอร์อื่น ๆ ของวิธีการโทรจะถูกส่งผ่านไปยังวิธีการยืมเป็นพารามิเตอร์ในขณะที่ใช้ในขณะที่ใช้มีสองพารามิเตอร์และพารามิเตอร์ที่สองจะถูกส่งผ่านในอาร์เรย์ ดังนั้นจึงอาจกล่าวได้ว่า
ความแตกต่างระหว่างวิธีการโทรและการใช้คือการเริ่มต้นจากพารามิเตอร์ที่สองพารามิเตอร์วิธีการโทรจะถูกส่งผ่านไปยังวิธีการยืมเป็นพารามิเตอร์ในขณะที่ใช้โดยตรงจะวางพารามิเตอร์เหล่านี้ลงในอาร์เรย์แล้วส่งผ่าน ในที่สุดรายการพารามิเตอร์ของวิธีการยืมก็เหมือนกัน
สถานการณ์แอปพลิเคชัน:
การโทรพร้อมใช้งานเมื่อพารามิเตอร์ชัดเจนและสามารถใช้อาร์กิวเมนต์ได้เมื่อพารามิเตอร์ไม่ชัดเจน
// ตัวอย่าง print.call (หน้าต่าง, "back", "light", "foot", "this"); // foo พารามิเตอร์อาจเป็นหลายฟังก์ชั่น foo () {<span style = "space สีขาว: pre"> </span> print.apply (หน้าต่าง, อาร์กิวเมนต์);};};บทความข้างต้นเข้าใจความแตกต่างระหว่างวิธีการสมัคร () และการโทร () อย่างลึกซึ้งใน JavaScript มันคือเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น