1. การปิดคืออะไรและห่วงโซ่ขอบเขตที่เกี่ยวข้องกับการปิดจะไม่ถูกกล่าวถึงที่นี่
2. กลไกการรวบรวมขยะ JavaScript
JavaScript ไม่จำเป็นต้องใช้หน่วยความจำฟรีด้วยตนเองมันใช้กลไกการรวบรวมขยะอัตโนมัติ เมื่อวัตถุไม่มีประโยชน์นั่นคือเมื่อไม่มีตัวแปรในโปรแกรมหมายถึงวัตถุตัวแปรจะถูกปล่อยออกมาจากหน่วยความจำ
การคัดลอกรหัสมีดังนี้:
var s = [1, 2,3];
var s = null;
// ด้วยวิธีนี้อาร์เรย์ดั้งเดิม [1, 2, 3] จะถูกปล่อยออกมา
3. การอ้างอิงรีไซเคิล
วัตถุสามชิ้น A, B, C
Aàbàc: แอตทริบิวต์บางอย่างของ A อ้างอิงถึง B และ C ยังอ้างอิงโดยแอตทริบิวต์ของ B หาก A ถูกล้างแล้ว B และ C ก็จะถูกปล่อยออกมาเช่นกัน
Aàbàcàb: มีการเพิ่มแอตทริบิวต์ของ C ที่นี่เพื่ออ้างถึงวัตถุ B หากนี่คือการล้าง A ดังนั้น B และ C จะไม่ถูกปล่อยออกมาเนื่องจากการอ้างอิงแบบวงกลมถูกสร้างขึ้นระหว่าง B และ C
การคัดลอกรหัสมีดังนี้:
var a = {};
a.pro = {a: 100};
a.pro.pro = {b: 100};
a = null;
// ในกรณีนี้ {a: 100} และ {b: 100} จะถูกปล่อยออกมาในเวลาเดียวกัน
var obj = {};
obj.pro = {a: 100};
obj.pro.pro = {b: 200};
var two = obj.pro.pro;
obj = null;
// ในกรณีนี้ {b: 200} จะไม่ถูกปล่อยออกมาในขณะที่ {a: 100} จะถูกปล่อยออกมา
4. รีไซเคิลอ้างอิงและปิด
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นด้านนอก () {
var obj = {};
ฟังก์ชั่น inner () {
// วัตถุ OBJ ถูกอ้างอิงที่นี่
-
obj.inner = ภายใน;
-
นี่คือการอ้างอิงแบบวงกลมที่ซ่อนอยู่และซ่อนเร้น เมื่อมีการเรียกด้านนอกหนึ่งครั้งวัตถุสองชิ้น OBJ และด้านในจะถูกสร้างขึ้นภายใน อสังหาริมทรัพย์ภายในของ OBJ หมายถึงภายใน ด้านในที่คล้ายกันยังหมายถึง OBJ เนื่องจาก OBJ ยังอยู่ในสภาพแวดล้อมที่ปิดของ InnerFun เพื่อความแม่นยำนี่เป็นเพราะ "โซ่ขอบเขต" ที่ไม่ซ้ำกันของ JavaScript
ดังนั้นการปิดจึงง่ายมากในการสร้างการอ้างอิงแบบวงกลมและโชคดีที่ JavaScript สามารถจัดการกับการอ้างอิงแบบวงกลมได้เป็นอย่างดี
5. หน่วยความจำรั่วใน IE
มีการรั่วไหลของหน่วยความจำหลายอย่างใน IE และมีคำอธิบายโดยละเอียดที่นี่ (http://msdn.microsoft.com/en-us/library/bb250448.aspx)
มีเพียงหนึ่งในสิ่งเหล่านี้ที่กล่าวถึงที่นี่คือการรั่วไหลของหน่วยความจำที่เกิดจากการอ้างอิงแบบวงกลมเพราะนี่เป็นสถานการณ์ที่พบบ่อยที่สุด
เมื่อมีการอ้างอิงลูประหว่างองค์ประกอบ DOM หรือวัตถุ ActiveX และวัตถุ JavaScript ปกติ IE มีปัญหาพิเศษในการปล่อยตัวแปรดังกล่าว เป็นการดีที่สุดที่จะตัดการอ้างอิงลูปด้วยตนเอง ข้อผิดพลาดนี้ได้รับการแก้ไขใน IE 7 (http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html)
“ IE 6 ได้รับความทุกข์ทรมานจากการรั่วไหลของหน่วยความจำเมื่อมีการอ้างอิงแบบวงกลมระหว่างวัตถุหลายอย่างซึ่งอย่างน้อยหนึ่งโหนด DOM ถูกสร้างขึ้นปัญหานี้ได้รับการแก้ไขใน IE 7”
หาก OBJ ในตัวอย่างข้างต้น (จุดที่ 4) อ้างอิงไม่ใช่วัตถุฟังก์ชัน JavaScript (ด้านใน) แต่เป็นวัตถุ ActiveX หรือองค์ประกอบ DOM การอ้างอิงแบบวงกลมที่เกิดขึ้นใน IE ไม่สามารถปล่อยออกมาได้
การคัดลอกรหัสมีดังนี้:
ฟังก์ชัน init () {
var elem = document.getElementById ('id');
elem.onclick = function () {
การแจ้งเตือน ('Rain-Man');
// องค์ประกอบ elem ถูกอ้างอิงที่นี่
-
-
Elem หมายถึงฟังก์ชั่นการฟังของเหตุการณ์คลิกและฟังก์ชั่นยังอ้างอิงองค์ประกอบ Elem ผ่านห่วงโซ่ขอบเขต ด้วยวิธีนี้แม้ว่าคุณจะออกจากหน้าปัจจุบันใน IE การอ้างอิงแบบวงกลมเหล่านี้จะไม่ถูกปล่อยออกมา
6. วิธีแก้ปัญหา
วิธีพื้นฐานคือการล้างข้อมูลวงกลมนี้ด้วยตนเอง ต่อไปนี้เป็นตัวอย่างที่ง่ายมาก เมื่อใช้งานคุณสามารถสร้างฟังก์ชั่น addevent () ด้วยตัวเองและล้างการผูกเหตุการณ์ทั้งหมดในเหตุการณ์การขนถ่ายของหน้าต่าง
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นด้านนอก () {
var one = document.getElementById ('one');
one.onclick = function () {};
-
window.onunload = function () {
var one = document.getElementById ('one');
one.onclick = null;
-
วิธีอื่น ๆ (โดย: Douglas Crockford)
การคัดลอกรหัสมีดังนี้:
-
* วนซ้ำผ่านโหนดองค์ประกอบบางอย่างและองค์ประกอบลูกหลานทั้งหมด
-
* @param elem โหนดโหนดองค์ประกอบที่จะล้าง
* ฟังก์ชั่นฟังก์ชั่น func ฟังก์ชั่นสำหรับการประมวลผล
-
-
ฟังก์ชั่น walkthedom (โหนด, func) {
func (โหนด);
node = node.firstchild;
ในขณะที่ (โหนด) {
Walkthedom (Node, Func);
node = node.nextsibling;
-
-
-
* ล้างข้อมูลอ้างอิงทั้งหมดจากโหนด DOM เพื่อป้องกันการรั่วไหลของหน่วยความจำ
-
* @param elem โหนดโหนดองค์ประกอบที่จะล้าง
-
-
ฟังก์ชั่น PurgeEventHandlers (โหนด) {
WalkTheDom (โหนด, ฟังก์ชัน (e) {
สำหรับ (var n ใน e) {
if (typeof e [n] ===
'การทำงาน') {
e [n] = null;
-
-
-
ข้างต้นเป็นเนื้อหาและโซลูชันที่เกี่ยวข้องสำหรับการรั่วไหลของหน่วยความจำ JavaScript เพื่อนที่ต้องการมันสามารถอ้างถึงมันได้