JavaScript เป็นแบบไม่เป็นทางการมากกว่าเมื่อเทียบกับภาษาการเขียนโปรแกรมอื่น ๆ ดังนั้นรหัส JavaScript จึงเต็มไปด้วยวิธีการเขียนแปลก ๆ ทุกชนิด บางครั้งคุณสามารถเห็นดอกไม้ในหมอก แน่นอนว่าความสามารถในการเข้าใจวิธีการเขียนประเภทต่าง ๆ ก็เป็นความเข้าใจในเชิงลึกเพิ่มเติมเกี่ยวกับลักษณะของภาษาจาวาสคริปต์
(function () {…}) () และ (function () {…} ()) เป็นสองวิธีทั่วไปในการดำเนินการฟังก์ชั่นใน JavaScript ทันที ตอนแรกฉันคิดว่ามันเป็นฟังก์ชั่นนิรนามที่ห่อหุ้มด้วยวงเล็บแล้วเพิ่มวงเล็บเพื่อเรียกฟังก์ชั่น ในที่สุดฉันก็บรรลุวัตถุประสงค์ในการดำเนินการทันทีหลังจากกำหนดฟังก์ชั่น ต่อมาฉันพบว่าเหตุผลในการเพิ่มวงเล็บไม่ใช่กรณี เพื่อให้เข้าใจถึงการดำเนินการของฟังก์ชั่นทันทีคุณต้องเข้าใจแนวคิดพื้นฐานของฟังก์ชั่นก่อน
การประกาศฟังก์ชั่นการแสดงออกของฟังก์ชั่นฟังก์ชั่นที่ไม่ระบุชื่อ
การประกาศฟังก์ชั่น: ฟังก์ชั่น fnname () {…}; ใช้คำหลักของฟังก์ชั่นเพื่อประกาศฟังก์ชั่นจากนั้นระบุชื่อฟังก์ชันที่เรียกว่าการประกาศฟังก์ชั่น
ฟังก์ชั่นนิพจน์ var fnname = function () {…}; ประกาศฟังก์ชั่นโดยใช้คำหลักฟังก์ชัน แต่ไม่ได้ตั้งชื่อฟังก์ชัน ในที่สุดฟังก์ชั่นที่ไม่ระบุชื่อจะถูกกำหนดตัวแปรที่เรียกว่านิพจน์ฟังก์ชันซึ่งเป็นรูปแบบที่พบบ่อยที่สุดของไวยากรณ์การแสดงออกของฟังก์ชั่น
ฟังก์ชั่นที่ไม่ระบุชื่อ: function () {}; ใช้คำหลักของฟังก์ชั่นเพื่อประกาศฟังก์ชั่น แต่ฟังก์ชั่นไม่ได้ตั้งชื่อดังนั้นจึงเรียกว่าฟังก์ชันที่ไม่ระบุชื่อ ฟังก์ชั่นนิรนามเป็นของนิพจน์ฟังก์ชั่น ฟังก์ชั่นที่ไม่ระบุชื่อมีฟังก์ชั่นมากมาย หากคุณกำหนดตัวแปรคุณจะสร้างฟังก์ชั่นและหากคุณกำหนดกิจกรรมคุณจะกลายเป็นตัวจัดการเหตุการณ์หรือสร้างการปิด ฯลฯ
ความแตกต่างระหว่างการประกาศฟังก์ชั่นและนิพจน์ฟังก์ชั่นคือ 1. เมื่อแยกวิเคราะห์รหัส JavaScript เอ็นจิ้น JavaScript จะ 'การโปรโมตการประกาศฟังก์ชั่น' (การประกาศฟังก์ชั่นการประกาศฟังก์ชั่น) การประกาศฟังก์ชั่นเกี่ยวกับสภาพแวดล้อมการดำเนินการปัจจุบัน (ขอบเขต) นิพจน์ฟังก์ชั่นจะต้องรอจนกว่าเอ็นจิ้น JavascirtP จะดำเนินการกับบรรทัดก่อนที่จะแยกวิเคราะห์การแสดงออกของฟังก์ชั่นจากบนลงล่างบรรทัด 2. นิพจน์ฟังก์ชั่นสามารถเรียกได้ทันทีด้วยวงเล็บหลังจากนิพจน์ฟังก์ชั่น การประกาศฟังก์ชั่นไม่สามารถทำได้และสามารถเรียกได้ในรูปแบบของ fnname () เท่านั้น นี่คือสองตัวอย่างของความแตกต่างระหว่างทั้งสอง
fnname (); ฟังก์ชั่น fnname () {... } // ปกติเพราะ 'การโปรโมต' การประกาศฟังก์ชันการเรียกใช้ฟังก์ชันสามารถ fnname (); var fnname = function () {... } // มีการรายงานข้อผิดพลาด var fnname = function () {Alert ('Hello World');} (); // พัสดุถูกเพิ่มหลังจากการแสดงออกของฟังก์ชัน เมื่อเครื่องยนต์ JavaScript วิเคราะห์ที่นี่ฟังก์ชั่นสามารถเรียกได้ทันทีฟังก์ชั่น fnname () {Alert ('Hello World');} (); // จะไม่มีข้อผิดพลาด แต่เครื่องมือ JavaScript เท่านั้นที่แยกการประกาศฟังก์ชัน } (); // ข้อผิดพลาดทางไวยากรณ์แม้ว่าฟังก์ชั่นนิรนามจะเป็นของฟังก์ชันนิพจน์การดำเนินการที่กำหนดจะดำเนินการ // ดังนั้นเอ็นจิ้น JavaScript จึงปฏิบัติต่อคำหลักของฟังก์ชันที่จุดเริ่มต้นเป็นการประกาศฟังก์ชั่นและรายงานข้อผิดพลาดหลังจากทำความเข้าใจแนวคิดฟังก์ชั่นพื้นฐานบางอย่างฉันมองย้อนกลับไปที่สองวิธีในการเขียน (ฟังก์ชั่น () {…}) () และ (ฟังก์ชั่น () {…} ()) ทันที ตอนแรกฉันคิดว่ามันเป็นฟังก์ชั่นนิรนามที่ห่อหุ้มด้วยวงเล็บและเพิ่มวงเล็บเพื่อเรียกใช้ฟังก์ชั่นทันที ในเวลานั้นฉันไม่รู้ว่าทำไมฉันต้องเพิ่มวงเล็บ หลังจากนั้นฉันก็รู้ว่าถ้าฉันต้องเพิ่มวงเล็บหลังจากร่างกายฟังก์ชั่นฉันสามารถเรียกมันได้ทันที จากนั้นฟังก์ชั่นนี้จะต้องเป็นนิพจน์ฟังก์ชันไม่ใช่การประกาศฟังก์ชั่น
(ฟังก์ชั่น (a) {console.log (a); // firebug output 123, ใช้ตัวดำเนินการ ()}) (123); (ฟังก์ชั่น (a) {console.log (a); // firebug output 1234, ใช้ตัวดำเนินการ ()} (1234)); ! ฟังก์ชั่น (a) {console.log (a); // firebug output 12345, ใช้! โอเปอเรเตอร์} (12345); +ฟังก์ชั่น (a) {console.log (a); // firebug output 123456, ใช้ + Operator} (123456); -function (a) {console.log (a); // firebug output 1234567, ใช้ - ผู้ประกอบการ} (1234567); var fn = function (a) {console.log (a); // firebug output 12345678, ใช้ = Operator} (12345678)คุณสามารถดูผลลัพธ์ผลลัพธ์และเพิ่มก่อนฟังก์ชั่น! , +, - และแม้กระทั่งเครื่องหมายจุลภาคสามารถใช้เพื่อดำเนินการทันทีหลังจากกำหนดฟังก์ชั่นและ () ,! ,! ตัวดำเนินการเช่น +, -, = แปลงการประกาศฟังก์ชั่นเป็นนิพจน์ฟังก์ชั่นกำจัดความคลุมเครือระหว่างเครื่องยนต์ JavaScript ระบุฟังก์ชั่นการแสดงออกและการประกาศฟังก์ชั่นบอกกับเอ็นจิ้น JavaScript ว่านี่เป็นนิพจน์ฟังก์ชันไม่ใช่การประกาศฟังก์ชั่น
การเพิ่มวงเล็บเป็นวิธีที่ปลอดภัยที่สุดในการทำเพราะ! ผู้ประกอบการเช่น, +และ - จะดำเนินการกับค่าผลตอบแทนของฟังก์ชั่นซึ่งบางครั้งทำให้เกิดปัญหาที่ไม่จำเป็น
แต่การใช้วิธีการเขียนแบบนี้คืออะไร?
ไม่มีแนวคิดเกี่ยวกับขอบเขตส่วนตัวใน JavaScript หากคุณประกาศตัวแปรบางอย่างในขอบเขตทั่วโลกหรือท้องถิ่นในโครงการที่พัฒนาโดยคนหลายคนอาจถูกเขียนทับโดยคนอื่นด้วยชื่อเดียวกัน ตามลักษณะของห่วงโซ่ขอบเขตของฟังก์ชั่น JavaScript เทคนิคนี้สามารถใช้ในการเลียนแบบขอบเขตส่วนตัวและใช้ฟังก์ชันที่ไม่ระบุชื่อเป็น "คอนเทนเนอร์" "คอนเทนเนอร์" สามารถเข้าถึงตัวแปรภายนอกในขณะที่สภาพแวดล้อมภายนอกไม่สามารถเข้าถึงตัวแปรภายใน "คอนเทนเนอร์" ดังนั้นตัวแปรที่กำหนดไว้ภายใน (ฟังก์ชัน () {…}) () จะไม่ขัดแย้งกับตัวแปรภายนอกหรือที่รู้จักกันทั่วไปว่า
jQuery ใช้วิธีนี้ เมื่อรหัส jQuery ถูกห่อหุ้มด้วย (ฟังก์ชั่น (หน้าต่างที่ไม่ได้กำหนด) {…รหัส jQuery …} (หน้าต่าง) มันสามารถป้องกันตัวแปรภายในของ jQuery เมื่อโทรรหัส jQuery ในขอบเขตทั่วโลก
บทความนี้เป็นความเข้าใจและการรวบรวมส่วนบุคคล หากมีข้อผิดพลาดใด ๆ โปรดชี้ให้เห็น มุมมองในบทความอ้างอิงจาก:
"คู่มือผู้มีสิทธิ์ JavaScript" และ "ขั้นสูงการเขียนโปรแกรม"