1. ما هو الإغلاق ولن تتم مناقشة سلسلة النطاق المتورطة في الإغلاق هنا.
2. آلية جمع القمامة JavaScript
لا تحتاج JavaScript إلى ذاكرة مجانية يدويًا ، فهي تستخدم آلية جمع القمامة التلقائي. عندما يكون الكائن عديم الفائدة ، فهذا يكون ، عندما لا يشير أي متغير في البرنامج إلى الكائن ، سيتم إصدار المتغير من الذاكرة.
نسخة الكود كما يلي:
var s = [1 ، 2،3] ؛
var s = null ؛
// بهذه الطريقة ، سيتم إصدار الصفيف الأصلي [1 ، 2 ، 3].
3. إعادة تدوير الاقتباس
ثلاثة كائنات أ ، ب ، ج
Aàbàc: تشير سمة معينة من A إلى B ، ويتم الإشارة أيضًا إلى سمة 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: 100} و {b: 100} أيضًا في نفس الوقت.
var obj = {} ؛
obj.pro = {a: 100} ؛
obj.pro.pro = {b: 200} ؛
var two = obj.pro.pro ؛
OBJ = فارغة ؛
// في هذه الحالة لن يتم إصدار {B: 200} ، بينما سيتم إصدار {A: 100}.
4. إعادة تدوير المراجع والإغلاق
نسخة الكود كما يلي:
وظيفة OUTER () {
var obj = {} ؛
وظيفة inner () {
// يتم الرجوع إلى كائن OBJ هنا
}
obj.inner = داخلي ؛
}
هذا نوع من المرجع الدائري المخفي ،. عندما يتم استدعاء الخارجي مرة واحدة ، يتم إنشاء كائنين OBJ والداخلية بداخله. يشير خاصية OBJ الداخلية إلى Inner ؛ يشير Inner المشابه أيضًا إلى OBJ ، لأن OBJ لا يزال في البيئة المغلقة لـ Innerfun. على وجه الدقة ، يرجع هذا إلى "سلسلة النطاق" الفريدة لجافا سكريبت.
لذلك ، من السهل جدًا إنشاء عمليات الإغلاق ، ولحسن الحظ ، يمكن لـ JavaScript التعامل مع مثل هذه المراجع الدائرية جيدًا.
5. تسرب الذاكرة في أي
هناك العديد من تسرب الذاكرة في 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 () بنفسك ومسح جميع روابط الأحداث في حدث إلغاء تحميل النافذة.
نسخة الكود كما يلي:
وظيفة OUTER () {
var one = document.getElementById ('One') ؛
One.onclick = function () {} ؛
}
window.onunload = function () {
var one = document.getElementById ('One') ؛
one.onclick = null ؛
} ؛
طرق أخرى (بواسطة: دوغلاس كروكفورد)
نسخة الكود كما يلي:
/**
* تكرار من خلال عقدة عنصر معينة وجميع عناصر سليل
*
* @param elem عقدة العنصر المراد مسحها
* param وظيفة func وظيفة للمعالجة
*
*/
وظيفة walkthedom (العقدة ، func) {
Func (عقدة) ؛
العقدة = node.firstchild ؛
بينما (العقدة) {
Walkthedom (العقدة ، func) ؛
العقدة = node.nextsibling ؛
}
}
/**
* مسح جميع المراجع من عقدة DOM لمنع تسرب الذاكرة
*
* @param elem عقدة العنصر المراد مسحها
*
*/
وظيفة purgeeventhandlers (العقدة) {
WalkTheDom (العقدة ، الوظيفة (e) {
لـ (var n in e) {
إذا (typeof e [n] ===
'وظيفة') {
e [n] = null ؛
}
}
}) ؛
ما سبق هو المحتوى والحلول ذات الصلة لتسربات ذاكرة JavaScript. يمكن للأصدقاء الذين يحتاجون إليها الرجوع إليها.