هذه مقالة حول تصحيح الأخطاء باستخدام JScript RuntimeObject (MSDN). على الرغم من أن معظم هذه الأمثلة لن تعمل في المتصفحات الأخرى، إلا أنها ستعمل في IE 5.5+.
معرف عالمي مسرب
على سبيل المثال، لنفترض أنك قمت عن طريق الخطأ بإنشاء خاصية عامة، مثل:
وظيفة اللعب الرجبي (اللاعبين) {
عناصر فار,
أنا؛
len = items.length;
// عالمي.
}
ركلة الوظيفة () {
فار س = 10
ص = 11؛
// كما أجعل y عالمية.
}
عند استدعاء playRugby، يتم إنشاء الخاصية العامة len، وإذا لم تكن موجودة بالفعل، يتم تعيين قيمة items.length إليها. وبالمثل، عند استدعاء الركلة، يتم إنشاء الخاصية العامة y.
لا شيء من هذه المتغيرات العالمية مقصود. إنهم يكسرون التغليف ويكشفون عن تفاصيل التنفيذ. يمكن أن يؤدي هذا إلى صراعات ومشكلات تبعية صعبة.
للكشف عن هذه المعرفات العالمية التي تم إنشاؤها عن غير قصد، يمكننا استخدام حلقة for على الكائن العام. توفر علامة "DOM" الخاصة بـ Firebug هذا الكشف الشامل المفيد.
لسوء الحظ، في IE، لا يمكن لـ in تعداد أي متغيرات عامة وإعلانات الوظائف. ألق نظرة على المثال التالي:
// خاصية الكائن المتغير العام.
فار EX1_GLOBAL_VARIABLE = 10;
// خاصية الكائن العام.
this.EX1_GLOBAL_PROPERTY = 11;
// خاصية الكائن المتغير العام.
الدالة EX1_GLOBAL_FUNCTION(){}
(وظيفة(){
نتائج فار = [];
ل(فار ع في هذا) {
results.push(p);
}
تنبيه("مسرب:n" + results.join("n"));
})();
في IE، تحتوي النتيجة على مجموعة من خصائص النافذة وواحدة من الخصائص الأربعة المعرفة من قبل المستخدم: EX1_GLOBAL_PROPERTY.
إذن، ماذا يحدث للخصائص الثلاثة الأخرى المحددة من قبل المستخدم؟ لماذا لا تظهر في حلقة for in.
اتضح أن تعداد كائن عمومي يعدد خصائص الكائن العمومي المعينة ولكن ليس المتغيرات العامة.
لماذا يمكن تعداد الخصائص العامة ولكن لا يمكن تعداد المتغيرات العامة. تخبرنا التجربة أن JScript تحدد المتغيرات العامة (المعلن عنها بـ var) على أنها DontEnum. نظرًا لأن الكائنات العامة يتم تعريفها على أنها كائنات متغيرة عمومية، فإن هذا يبدو تفسيرًا معقولًا. هذا ليس معيارًا ولكنه يفسر السلوك في IE. ومع ذلك، اقترح إريك ليبرت تفسيرًا آخر: الكائنات العالمية والكائنات المتغيرة الشاملة هما كائنان مختلفان في IE.
وفقًا لـ MS-ES3:
يقوم تعريف المتغير في JScript 5.x بإنشاء خاصية للكائن العمومي الذي يحتوي على السمة DontEnum.