เข้าใจความแตกต่างในสไตล์การปิดใน JavaScript
เมื่อดำน้ำเข้าสู่การเขียนโปรแกรม JavaScript ผู้เขียนอาจพบกับสไตล์ต่าง ๆ ในการเขียนการปิด หนึ่งในสไตล์ที่โดดเด่นคือ anonymous constructor
และ inline executed function
นักพัฒนาหลายคนมักสงสัยว่าสิ่งที่ทำให้สองสไตล์นี้แตกต่างกันคืออะไร และหนึ่งในนั้นดีกว่าอีกอันหรือไม่ ในโพสต์บล็อกนี้ เราจะไม่เพียงแต่สำรวจความแตกต่างในพฤติกรรมระหว่างสไตล์การปิดทั้งสองนี้ แต่ยังประเมินข้อดีและข้อเสียดังกล่าวด้วย
การปิดคืออะไร?
ก่อนที่เราจะเจาะลึกถึงรายละเอียดเฉพาะของแต่ละสไตล์ ให้เราอธิบายสั้น ๆ ว่าการปิดคืออะไรใน JavaScript การปิดคือฟังก์ชันที่รักษาการเข้าถึงขอบเขตเชิงเล็กซ์ของมัน แม้ว่าฟังก์ชันนั้นจะถูกเรียกใช้นอกขอบเขตนั้นก็ตาม กฎนี้ช่วยให้เกิดรูปแบบการเขียนโปรแกรมที่ทรงพลัง เช่น การสร้างข้อมูลและฟังก์ชันโรงงาน
สไตล์การปิดทั้งสอง
1. Anonymous Constructor
สไตล์แรกเรียกว่า anonymous constructor
ซึ่งสามารถกำหนดได้ดังนี้:
new function() {
// โค้ดของคุณที่นี่
}
วิธีนี้จะเรียกใช้ฟังก์ชันที่คุณสามารถกำหนดตรรกะของคุณได้ การมีคีย์เวิร์ด new
ทำให้ฟังก์ชันนี้ถูกปฏิบัติว่าเป็นคอนสตรัคเตอร์
2. Inline Executed Function
สไตล์ที่สองคือ inline executed function
ซึ่งดูเช่นนี้:
(function() {
// โค้ดของคุณที่นี่
})();
ในกรณีนี้ ฟังก์ชันจะถูกเรียกใช้อย่างรวดเร็ว ทำให้เป็นวิธีที่รวดเร็วในการรันโค้ดโดยไม่ต้องมีคอนสตรัคเตอร์
ความแตกต่างที่สำคัญระหว่างสไตล์ทั้งสอง
ตอนนี้เราทราบพื้นฐานของแต่ละสไตล์แล้ว มาลองเปรียบเทียบกันตามพฤติกรรมและประสิทธิภาพ
ค่าที่คืนกลับ
- พฤติกรรมการคืนค่า:
- สำหรับ
anonymous constructor
ค่าที่คืนของฟังก์ชันอาจแตกต่างกันขึ้นอยู่กับว่ามีการคืนค่าจริงหรือไม่ - ในทางตรงกันข้าม
inline executed function
ไม่มีข้อกังวลนี้ มันเพียงแค่เรียกใช้งานโดยไม่ต้องพิจารณาเกี่ยวกับวัตถุ
- สำหรับ
คอนเท็กซ์ this
- พฤติกรรมของคอนเท็กซ์:
- เมื่อใช้
new function()
ค่าของthis
ภายในฟังก์ชันจะอ้างถึงวัตถุใหม่ที่ถูกสร้างขึ้น - ในทางกลับกัน ใน
inline executed function
ค่าของthis
จะอ้างถึงบริบททั่วโลก (หรือundefined
ในโหมดเคร่ง)
- เมื่อใช้
การพิจารณาด้านประสิทธิภาพ
- ความเร็ว:
- สไตล์
new function()
อาจช้ากว่าเพราะมันต้องสร้างวัตถุใหม่สำหรับthis
- อย่างไรก็ตาม ความแตกต่างด้านประสิทธิภาพมักจะไม่สำคัญ เว้นแต่อีกฝ่ายกำลังรันโค้ดจำนวนมาก โดยทั่วไปแนะนำให้หลีกเลี่ยงการใช้การปิดที่ซับซ้อนในโค้ดที่ต้องพิจารณาเรื่องประสิทธิภาพ
- สไตล์
กลไกภายใน
- การทำงานภายในของ
new expression
สามารถสรุปได้ดังนี้:
var tempObject = {};
var result = expression.call(tempObject);
if (result is not an object)
result = tempObject;
- ที่นี่
tempObject
จะได้รับโปรโตไทป์จากการแสดงออกก่อนการเรียก นี่คือปรากฏการณ์ที่สำคัญในวิธีที่ JavaScript จัดการฟังก์ชันคอนสตรัคเตอร์
สรุป: จะเลือกใช้แบบไหน?
การเลือกใช้ระหว่าง anonymous constructors
และ inline executed functions
มักจะขึ้นอยู่กับความต้องการเฉพาะของโค้ดของคุณ
- ใช้ anonymous constructor หากคุณต้องการตั้งค่าบริบทของ
this
ให้กับวัตถุใหม่ที่ถูกสร้างขึ้นหรือจัดการค่าที่คืนที่ต้องกลายเป็นวัตถุ - เลือกใช้ inline executed function หากคุณมุ่งเน้นที่จะเรียกใช้งานโค้ดโดยไม่ต้องมีภาระในการสร้างวัตถุใหม่
ในสถานการณ์ส่วนใหญ่ เมื่อพิจารณาถึงประสิทธิภาพและความสามารถในการอ่าน นักพัฒนามักจะพบว่าตนเองนิยมใช้ inline executed function
แต่ทั้งสองสไตล์ก็มีที่ในระบบนิเวศ JavaScript การเข้าใจความแตกต่างเหล่านี้จะทำให้คุณสามารถตัดสินใจได้อย่างชาญฉลาดมากขึ้นในเส้นทางการเขียนโค้ดของคุณ
ขอให้สนุกกับการเขียนโค้ด! หากคุณมีคำถามเพิ่มเติมหรือประสบการณ์เกี่ยวกับสไตล์การปิด โปรดแบ่งปันในความคิดเห็นด้านล่าง!