ฉันได้ติดต่อกับ JavaScript มาเป็นเวลานานและทุกครั้งที่ฉันเข้าใจการปิดฉันกำลังมองหางานที่ส่วนหน้าของเว็บเมื่อเร็ว ๆ นี้ดังนั้นฉันจึงต้องรวมรากฐาน
บทความนี้หมายถึง การปิด บล็อกของ Joy_lee ตามบล็อกของเธอและมุ่งมั่นที่จะอธิบายความเข้าใจของฉันในรูปแบบของความคิดเห็น หากมีความไม่เหมาะสมใด ๆ การวิจารณ์และการแก้ไขก็ยินดีต้อนรับ
ในการเขียนโปรแกรมขั้นสูงนี่จะมีการกล่าวว่า: เมื่อมีการกำหนดฟังก์ชั่นอื่น ๆ ภายในฟังก์ชั่นการปิดจะถูกสร้างขึ้น การปิดมีสิทธิ์ในการเข้าถึงตัวแปรทั้งหมดที่มีอยู่ภายในฟังก์ชั่น
(คุณเข้าใจประโยคนี้ได้อย่างไร? ตามประโยคนี้การปิดเป็นฟังก์ชั่นซ้อนกัน! ฟังก์ชั่นซ้อนกันแน่นอนสามารถเข้าถึงตัวแปรของฟังก์ชั่นที่มีอยู่และไม่มีปัญหา)
โดยทั่วไปฟังก์ชั่นภายในสามารถเข้าถึงตัวแปรในระดับก่อนหน้าหรือแม้แต่ระดับโลก ดังนั้นบางคนจึงเข้าใจสิ่งนี้: ผ่านการปิดการเข้าถึงตัวแปรภายนอกภายในฟังก์ชั่นท้องถิ่นสามารถทำได้
(ถ้าเราแบ่งขอบเขตออกเป็นระดับหนึ่งสมมติว่าขอบเขตทั่วโลกเป็นระดับแรกที่ขอบเขตของฟังก์ชั่นที่กำหนดขอบเขตภายในคือระดับที่สองและขอบเขตของร่างกายที่กำหนดขอบเขตภายในนั้นซ้อนอยู่ภายในขอบเขตระดับที่สองเป็นระดับที่สาม ฯลฯ ในระดับที่สามไม่สามารถเข้าถึงได้ระดับที่สาม ขอบเขตของระดับนี้และจากนั้นค้นหาระดับก่อนหน้านี้จนกระทั่งระดับโลกระดับแรก กลไกการรวบรวมขยะ GC เพื่อไม่ให้รีไซเคิลทรัพยากรที่ครอบครองโดยห่วงโซ่นี้
ฟังก์ชั่น a () {var i = 0; ฟังก์ชั่น b () {แจ้งเตือน (++ i); } return b; } var c = a (); C ();นั่นคือฟังก์ชั่นของการปิดคือหลังจากที่ A ถูกดำเนินการและส่งคืนการปิดทำให้กลไกการรวบรวมขยะ JavaScript GC ไม่กู้คืนทรัพยากรที่ถูกครอบครองโดย A เนื่องจากการดำเนินการของฟังก์ชั่นภายใน B ของความต้องการที่จะพึ่งพาตัวแปรใน
เนื่องจากการมีอยู่ของการปิดหลังจากฟังก์ชั่นผลตอบแทนฉันอยู่เสมอ ด้วยวิธีนี้ทุกครั้งที่ C () ดำเนินการฉันเป็นค่าของฉันแจ้งเตือนหลังจากเพิ่ม 1
จากนั้นหาก A ไม่คืนฟังก์ชั่น B สถานการณ์จะแตกต่างกันอย่างสิ้นเชิง เพราะหลังจากถูกประหารชีวิต B จะไม่ถูกส่งกลับไปยังโลกภายนอกของ A แต่มีการอ้างอิงโดย A และในเวลานี้ A จะถูกอ้างอิงโดย B เท่านั้นดังนั้นฟังก์ชั่น A และ B ถูกอ้างอิงโดยกันและกัน แต่ไม่ถูกรบกวนจากโลกภายนอก
ในความเป็นจริงมันคือการปิดที่ขยายวงจรชีวิตของตัวแปร โดยปกติแล้วขอบเขตของฟังก์ชั่นนั่นคือตัวแปรจะถูกทำลายหลังจากฟังก์ชั่นถูกดำเนินการ แต่เมื่อฟังก์ชั่นส่งคืนการปิดตราบใดที่การปิดไม่ได้เปิดตัวโซ่ขอบเขตทั้งหมดจะครอบครองหน่วยความจำ (การปิดขยายวงจรชีวิตของตัวแปรซึ่งหมายถึงกรณีของการอ้างอิงในระดับแรก แต่หากไม่มีการอ้างอิงนี้จะยังคงถูกเรียกว่าปิดได้หรือไม่)
การพูดถึงโซ่ขอบเขต: นั่นคือขอบเขตของฟังก์ชั่นขอบเขตของฟังก์ชั่นของเลเยอร์ก่อนหน้านี้ ... และขอบเขตทั่วโลก เมื่อเข้าถึงตัวแปรหากคุณไม่มีให้ค้นหาเลเยอร์ด้วยเลเยอร์จนกระทั่งทั้งโลก หากคุณยังไม่มีคุณจะรายงานข้อผิดพลาด
(ฉันต้องการบ่นจริงๆว่าห่วงโซ่ขอบเขตของการปิดเป็นโค้ง)
PS: ชาวเน็ตบางคนแนะนำบทความอื่น เพื่อวิเคราะห์แนวคิดของการปิด JavaScript มันมีสิทธิ์หรือไม่? ในที่สุดก็มีแนวคิดที่ชัดเจน:
ต้องพูดมากว่าการปิดคืออะไร? มาสรุปไว้ด้านล่าง:
การปิดเป็นแนวคิดที่อธิบายปรากฏการณ์ที่หน่วยความจำอยู่หลังจากการดำเนินการฟังก์ชั่นถูกปล่อยออกมา ตราบใดที่คุณเข้าใจแนวคิดหลักนี้การปิดก็ไม่ยากที่จะเข้าใจ
บทความข้างต้นช่วยให้คุณเข้าใจการปิดในประโยคเดียว (ง่ายและเข้าใจง่าย) เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น