تشرح هذه المقالة بالتفصيل توقيت وطرق إدارة الذاكرة وإصدارها بواسطة JavaScript و IE Browser ، على أمل أن تكون مفيدة للمطورين في الواجهة الأمامية.
مثيل لإصدار الذاكرة
نسخة الكود كما يلي:
<script language = "javaScript">
<!-
strtest = "1" ؛
لـ (var i = 0 ؛ i <25 ؛ i ++)
{
strtest += strtest ؛
}
تنبيه (strtest) ؛
حذف strtest.
CollectGarbage () ؛
//->
</script>
CollectGarbage هي خاصية فريدة من نوعها من IE ، تستخدم لإطلاق الذاكرة. يجب أن تكون طريقة الاستخدام: اضبط الكائن المتغير أو المرجعي على NULL أو حذفه ، ثم إجراء إجراء الإصدار.
يجب أن تكون شرطان ضروريان واضحين قبل القيام بجمع المنجدات:
المرجع - الكائن غير صالح خارج السياق الذي يعيش فيه.
- سيكون الكائن العالمي غير صالح إذا لم يتم تنفيذه (المشار إليه).
نسخة الكود كما يلي:
// -------------------------------------------------
// متى يفشل كائن JavaScript
// -------------------------------------------------
وظيفة testObject () {
var _obj1 = new Object () ؛
}
وظيفة testObject2 () {
var _obj2 = new Object () ؛
العودة _obj2 ؛
}
// مثال 1
testObject () ؛
// مثال 2
TestObject2 ()
// مثال 3
var obj3 = testObject2 () ؛
OBJ3 = فارغة ؛
// مثال 4
var obj4 = testObject2 () ؛
var arr = [obj4] ؛
OBJ3 = فارغة ؛
arr = [] ؛
في هذه الأمثلة الأربعة:
- "مثال 1" بنيات _OBJ1 في وظيفة testObject () ، ولكن عندما تخرج الوظيفة ، تركت سياق الوظيفة ، لذلك _OBJ1 غير صالح ؛
- في "مثال 2" ، يتم إنشاء كائن _OBJ2 أيضًا في TestObject2 () ويتم تمريره ، وبالتالي فإن الكائن له بيئة سياق (وعمر) "خارج الوظيفة" ، ولكن نظرًا لأن قيمة إرجاع الوظيفة ليست "محتفظ بها" من قبل متغيرات أخرى ، فإن _OBJ2 غير صالح على الفور ؛
- في "مثال 3" ، يتم الاحتفاظ بـ _OBJ2 التي تم إنشاؤها بواسطة TestObject2 () بواسطة المتغير الخارجي OBJ3. في هذا الوقت ، حتى يصبح سطر الكود "OBJ3 = NULL" ساري المفعول ، لن يكون _OBJ2 غير صالح لأن العلاقة المرجعية تختفي.
- لنفس السبب كما في المثال 3 ، لن يكون _OBJ2 في "مثال 4" غير صالح بعد سطر الكود "arr = []".
ومع ذلك ، فإن "فشل" الكائن لا ينتظر أن يتم إصداره ". داخل وقت تشغيل JavaScript ، لا توجد طريقة لإخبار المستخدم بالضبط "متى سيتم إصدار الكائن". هذا يعتمد على آلية استرداد ذاكرة JavaScript. هذه الاستراتيجية تشبه آلية إعادة التدوير في .NET.
في رمز مثال عملية Excel السابق ، لن يحدث مالك الكائن ، أي "excel.exe" ، إلا بعد "إطلاق مثيل كائن ActiveX". ترتبط أقفال الملف وبيانات اعتماد إذن نظام التشغيل بالعملية. لذلك إذا كان الكائن "فشل" فقط وليس "الإصدار" ، فستواجه عمليات أخرى مشاكل عند معالجة الملفات والإشارة إلى بيانات اعتماد نظام التشغيل.
- يقول بعض الناس أن هذا خطأ في آلية JavaScript أو COM. في الواقع ، ليس كذلك. يحدث هذا بسبب وجود علاقة معقدة بين OS و IE و JavaScript ، بدلاً من مشكلة مستقلة.
كشفت Microsoft عن استراتيجية لحل هذه المشكلة: استدعاء بشكل استباقي عملية إعادة تدوير الذاكرة.
يتم توفير عملية CollectGarBage () (يشار إليها عادة باسم عملية GC) في (Microsoft) JScript. يتم استخدام عملية GC لتنظيف "اختلال الكائن الفاشل" في IE الحالي ، أي عملية المدمرة المتمثلة في استدعاء الكائن.
في المثال أعلاه ، فإن الكود الذي يستدعي إجراء GC هو:
نسخة الكود كما يلي:
// -------------------------------------------------
// طريقة الاتصال القياسية لإجراءات GC عند معالجة كائن ActiveX
// -------------------------------------------------
وظيفة الكتابة () {
//(طفيف...)
excel.quit () ؛
excel = null ؛
setTimeout (CollectGarbage ، 1) ؛
}
يدعو السطر الأول من الكود طريقة excel.quit () لجعل عملية الإجهاض والخروج من عملية Excel. في هذا الوقت ، نظرًا لأن بيئة JavaScript لديها مثيل كائن Excel ، فإن عملية Excel لا تعمل فعليًا.
يجعل السطر الثاني من التعليمات البرمجية Excel Null لمسح مراجع الكائن ، وبالتالي "إبطال" الكائن. ومع ذلك ، نظرًا لأن الكائن لا يزال في سياق الوظيفة ، إذا تم استدعاء إجراء GC مباشرةً ، فلن يتم تنظيف الكائن.
يستخدم السطر الثالث من التعليمات البرمجية SetTimeOut () استدعاء وظيفة CollectGarbage ، ويتم تعيين الفاصل الزمني على "1" ، مما يجعل عملية GC تحدث فقط بعد تنفيذ وظيفة WriteXLS (). وبهذه الطريقة ، يلبي كائن Excel شرطين من "يمكن تنظيفه بواسطة GC": لا يوجد مرجع وترك السياق.
استخدام إجراءات GC فعال للغاية في بيئات JS باستخدام كائن ActiveX. تشمل بعض ActiveXobjects المحتملة XML و VML و OWC (Office Web Componet) و Flash وحتى Vbarray في JS. من وجهة النظر هذه ، نظرًا لأن بنية AJAX تتبنى XMLHTTP وتحتاج أيضًا إلى تلبية ميزة "عدم تبديل الصفحة" ، فإن الاتصال بنشاط بعملية GC في الأوقات المناسبة سيمنحك تجربة أفضل كفاءة باستخدام واجهة المستخدم.
في الواقع ، حتى مع عملية GC ، لن يتم حل مشكلة Excel المذكورة أعلاه بالكامل. لأن IE أيضا Caches بيانات الاعتماد. الطريقة الوحيدة لجعل بيانات اعتماد إذن الصفحة هي "التبديل إلى صفحة جديدة" ،
لذلك ، في الواقع ، في مشروع SPS المذكور أعلاه ، فإن الطريقة التي استخدمتها لم تكن GC ، ولكن الكود التالي:
نسخة الكود كما يلي:
// -------------------------------------------------
// صفحة تبديل الصفحة المستخدمة عند معالجة كائن ActiveX
// -------------------------------------------------
وظيفة الكتابة () {
//(طفيف...)
excel.quit () ؛
excel = null ؛
// يتم استخدام الكود التالي لحل خطأ في IE Call Excel ، الطريقة المقدمة في MSDN:
// setTimeout (CollectGarbage ، 1) ؛
// نظرًا لأنه لا يمكن مسح الحالة الموثوقة لصفحة الويب (أو متزامنها) ستؤدي
// غير صالح في المرة القادمة التي تسميها.
location.reload () ؛
}
وصف عامل حذف في اليدوية
يزيل المرجع سمة من كائن ، أو يحذف عنصرًا من صفيف.
حذف التعبير
معلمة التعبير هي تعبير JScript صالح ، وعادة ما يكون اسم خاصية أو عنصر صفيف.
يوضح
إذا كانت نتيجة التعبير كائنًا وكانت السمة المحددة في التعبير موجودة ، ولا يسمح الكائن بحذفه ، يتم إرجاع خطأ.
في جميع الحالات الأخرى ، العودة صحيح.
أخيرًا ، ملاحظة تكميلية حول GC: عندما يتم تقليل نموذج IE ، فإن IE سوف تسمي بنشاط وظيفة CollectGarbage () مرة واحدة. هذا يجعل استخدام الذاكرة تحسن بشكل كبير بعد تقليل نافذة IE