การปิดใน JavaScript เป็นคำถามที่น่าเบื่อจริงๆ เมื่อเร็ว ๆ นี้ฉันได้ถามเกี่ยวกับทักษะการแสดงออกของตัวเองและฉันไม่สามารถสนับสนุนพวกเขาได้อย่างเต็มที่ ฉันบ้า ระหว่างทางกลับฉันก็นึกถึงสิ่งที่ง่ายมาก ในความเป็นจริงเมื่อเรากำลังทำโครงการเรามักจะใช้การปิด แต่เมื่อเราถามคำถามคำตอบมักจะเป็นคำตอบที่เราพบบ่อย อนิจจาไม่ว่าเราจะจัดการกับการสัมภาษณ์หรือต้องการเรียนรู้บางสิ่งบางอย่างฉันจะแบ่งปันความเข้าใจของตัวเองกับคุณและการเขียนก็หลีกเลี่ยงไม่ได้
1. การปิดคืออะไร?
หนังสือของ Red Bao กล่าวว่า: "มันหมายถึงฟังก์ชั่นที่มีสิทธิ์ในการเข้าถึงตัวแปรในขอบเขตฟังก์ชันอื่น"
พูดง่ายๆ JavaScript อนุญาตให้ใช้ฟังก์ชั่นภายใน - นั่นคือคำจำกัดความของฟังก์ชั่นและการแสดงออกของฟังก์ชั่นอยู่ในฟังก์ชันของฟังก์ชั่นอื่น ยิ่งไปกว่านั้นฟังก์ชั่นภายในเหล่านี้สามารถเข้าถึงตัวแปรท้องถิ่นพารามิเตอร์และฟังก์ชั่นภายในอื่น ๆ ที่ประกาศในฟังก์ชั่นภายนอกที่พวกเขาอาศัยอยู่ เมื่อหนึ่งในฟังก์ชั่นภายในเหล่านี้เรียกว่านอกฟังก์ชั่นภายนอกที่มีอยู่การปิดจะเกิดขึ้น กล่าวง่ายๆคือ "ฟังก์ชั่นสร้างฟังก์ชั่นอื่นภายในและฟังก์ชั่นหลังสามารถอ่านตัวแปรในฟังก์ชั่นด้านบนและฟังก์ชั่นหลังสามารถเรียกได้ว่า 'ปิด'"
2. การใช้งานปิดคืออะไร?
จากการตรวจสอบอย่างกว้างขวางของฉันถ้าเราพูดว่า "โดยการใช้การปิดเราสามารถทำสิ่งต่าง ๆ ได้มากมายตัวอย่างเช่นเราจำลองรูปแบบรหัสเชิงวัตถุแสดงรหัสอย่างสง่างามและรัดกุมมากขึ้นและปรับปรุงประสิทธิภาพการดำเนินการของรหัสในบางแง่มุม" มันจะว่างเปล่า? สิ่งเหล่านี้จะดีกว่าหรือไม่? เนื่องจากไม่มีขอบเขตระดับบล็อกจริงใน JavaScript แต่เพื่อที่จะประกาศตัวแปรท้องถิ่นบางตัวที่มีเพียงฟังก์ชั่นเท่านั้นที่สามารถใช้งานได้เราจะใช้การปิดเพื่อให้เราสามารถลดตัวแปรในขอบเขตทั่วโลกได้อย่างมากและชำระขอบเขตทั่วโลก
นี่คือตัวอย่างบางส่วน:
1. ฟังก์ชั่นการดำเนินการตนเองที่ไม่ระบุชื่อ
เรารู้ว่าหากตัวแปรทั้งหมดไม่ได้ถูกเพิ่มด้วยคำหลัก VAR ค่าเริ่มต้นจะถูกเพิ่มลงในคุณสมบัติของวัตถุทั่วโลก มีข้อเสียมากมายในการเพิ่มตัวแปรชั่วคราวลงในวัตถุทั่วโลก
ตัวอย่างเช่น: ฟังก์ชั่นอื่น ๆ อาจใช้ตัวแปรเหล่านี้ในทางที่ผิด ทำให้วัตถุทั่วโลกมีขนาดใหญ่เกินไปและส่งผลต่อความเร็วในการเข้าถึง (เนื่องจากค่าของตัวแปรจะต้องถูกข้ามจากห่วงโซ่ต้นแบบ)
ในทุกครั้งที่เราใช้ตัวแปรเราจะใช้คำหลัก VAR ในสถานการณ์จริงเรามักจะพบกับสถานการณ์ที่บางฟังก์ชั่นจำเป็นต้องดำเนินการเพียงครั้งเดียวและตัวแปรภายในของพวกเขาไม่จำเป็นต้องได้รับการดูแล
ตัวอย่างเช่นในการเริ่มต้นของ UI เราสามารถใช้การปิด:
var data = {table: [], tree: {}}; (ฟังก์ชั่น (dm) {สำหรับ (var i = 0; i <dm.table.rows; i ++) {var row = dm.table.rows [i]; สำหรับ (var j = 0; j <row.cells; i ++) {drawcell (i, j);}}}) (data);เราสร้างฟังก์ชั่นที่ไม่ระบุชื่อและดำเนินการทันที เนื่องจากภายนอกไม่สามารถอ้างถึงตัวแปรที่อยู่ภายในทรัพยากรจะถูกปล่อยออกมาทันทีหลังจากดำเนินการฟังก์ชั่น กุญแจสำคัญคือการไม่ก่อให้เกิดมลพิษจากวัตถุระดับโลก
2. ผลลัพธ์แคช
เราจะพบกับสถานการณ์ต่าง ๆ ในการพัฒนา ลองนึกภาพว่าเรามีวัตถุฟังก์ชั่นที่ใช้เวลานานมากซึ่งใช้เวลานานในการประมวลผลการโทรแต่ละครั้ง จากนั้นเราต้องเก็บค่าที่คำนวณไว้ เมื่อเรียกใช้ฟังก์ชั่นนี้ก่อนอื่นเราค้นหาในแคช หากไม่พบเราจะทำการคำนวณจากนั้นอัปเดตแคชและส่งคืนค่า หากพบเราสามารถส่งคืนค่าที่พบได้โดยตรง การปิดทำสิ่งนี้อย่างแน่นอนเพราะมันไม่ได้ปล่อยการอ้างอิงภายนอกเพื่อให้ค่าภายในฟังก์ชั่นสามารถเก็บรักษาไว้ได้
var cachedSearchbox = (function () {var cache = {}, count = []; return {attachSearchBox: ฟังก์ชัน (dSID) {ถ้า (dSID ในแคช) {// ถ้าผลลัพธ์อยู่ในแคชส่งคืนแคช [dSID]; // ส่งคืนวัตถุในแคชโดยตรง CACHE [DSID] = FSB; // UPDATE CACHE IF (Count.length> 100) {// ความปลอดภัยขนาดแคช <= 100 ลบแคช [count.shift ()]; cachedsearchbox.attachsearchbox ("อินพุต");ด้วยวิธีนี้เราจะอ่านวัตถุจากแคชในการโทรครั้งที่สอง
3. บรรจุภัณฑ์
var person = function () {// ขอบเขตของตัวแปรอยู่ในฟังก์ชันและไม่สามารถเข้าถึงชื่อ VAR ได้นอก var name = "default"; return {getName: function () {return name; }, setName: function (newName) {name = newName; - print (person.name); // การเข้าถึงโดยตรงผลลัพธ์คือการพิมพ์ที่ไม่ได้กำหนด (person.getName ()); person.setName ("Abruzzi"); พิมพ์ (person.getName ());4. ใช้คลาสและการสืบทอด
ฟังก์ชันบุคคล () {var name = "default"; return {getName: function () {return name; }, setName: function (newName) {name = newName; - var p = คนใหม่ (); P.SetName ("Tom"); การแจ้งเตือน (p.getName ()); var jack = function () {}; // สืบทอดมาจาก Jack.prototype = คนใหม่ (); // เพิ่มวิธีการส่วนตัว jack.prototype.say = function () {Alert ("สวัสดีชื่อของฉันคือ Jack"); - var j = new Jack (); J.SetName ("Jack"); J.Say (); การแจ้งเตือน (j.getName ());ในตอนท้ายของการเขียนฉันไม่รู้ว่าในท้ายที่สุดคุณทุกคนพบว่าคุณเคยใช้สิ่งนี้มากมายในโครงการที่คุณทำ อย่างไรก็ตามฉันพบมันและนี่คือวิธีการปิด
แม้ว่ามันจะเป็นความคิดโบราณ แต่ก็ยังมีความสำคัญมาก สำหรับข้อบกพร่องของการปิดเพียงแค่บอกว่าถ้าคุณไม่ถูกปิดการปิดมันจะนำไปสู่การรั่วไหลของหน่วยความจำ หน่วยความจำรั่วไหลบน Baidu คืออะไร^_^
การวิเคราะห์สั้น ๆ และการตีความการปิดใน JavaScript (ต้องอ่าน) เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น