นี่คือบทความเกี่ยวกับการดีบักด้วย JScript RuntimeObject (MSDN) แม้ว่าตัวอย่างเหล่านี้ส่วนใหญ่จะใช้ไม่ได้กับเบราว์เซอร์อื่น แต่จะทำงานใน IE 5.5 ขึ้นไป
ตัวระบุส่วนกลางรั่วไหล
ตัวอย่างเช่น สมมติว่าคุณสร้างพร็อพเพอร์ตี้ส่วนกลางโดยไม่ได้ตั้งใจ เช่น:
ฟังก์ชั่น playRugby (ผู้เล่น) {
รายการต่างๆ
ฉัน;
len = รายการความยาว;
// ทั่วโลก.
-
ฟังก์ชั่นเตะ () {
วาร์ x = 10
ย = 11;
// ขณะที่ฉันทำให้ y เป็นสากล
-
เมื่อเรียก playRugby คุณสมบัติโกลบอล len จะถูกสร้างขึ้น และหากไม่มีอยู่ ค่าของ items.length จะถูกกำหนดให้กับมัน ในทำนองเดียวกัน เมื่อมีการเรียกเตะ คุณสมบัติโกลบอล y จะถูกสร้างขึ้น
ตัวแปรทั่วโลกเหล่านี้ไม่มีเจตนา พวกเขาทำลายการห่อหุ้มและเปิดเผยรายละเอียดการใช้งาน ซึ่งอาจนำไปสู่ข้อขัดแย้งและปัญหาการขึ้นต่อกันที่ยุ่งยาก
ในการตรวจจับตัวระบุส่วนกลางที่สร้างขึ้นโดยไม่ได้ตั้งใจ เราสามารถใช้ for in loop บนอ็อบเจ็กต์ส่วนกลางได้ แท็ก "DOM" ของ Firebug ให้การตรวจจับทั่วโลกที่มีประโยชน์นี้
น่าเสียดายที่ใน IE นั้น for in ไม่สามารถระบุตัวแปรโกลบอลและการประกาศฟังก์ชันได้ ลองดูตัวอย่างต่อไปนี้:
// คุณสมบัติของวัตถุตัวแปรโกลบอล
วาร์ EX1_GLOBAL_VARIABLE = 10;
// คุณสมบัติของอ็อบเจ็กต์โกลบอล
นี้.EX1_GLOBAL_PROPERTY = 11;
// คุณสมบัติของวัตถุตัวแปรโกลบอล
ฟังก์ชัน EX1_GLOBAL_FUNCTION(){}
(การทำงาน(){
ผลลัพธ์ var = [];
สำหรับ (var p ในนี้) {
ผลลัพธ์.ผลักดัน(p);
-
alert("รั่วไหล:n" + results.join("n"));
-
ใน IE ผลลัพธ์ประกอบด้วยคุณสมบัติของหน้าต่างและหนึ่งในสี่คุณสมบัติที่ผู้ใช้กำหนด: EX1_GLOBAL_PROPERTY
แล้วจะเกิดอะไรขึ้นกับคุณสมบัติที่ผู้ใช้กำหนดอีกสามรายการ? ทำไมพวกมันไม่แสดงขึ้นมาใน for in loop
ปรากฎว่าการแจงนับอ็อบเจ็กต์ส่วนกลางจะระบุคุณสมบัติของอ็อบเจ็กต์โกลบอลที่กำหนด แต่ไม่ใช่ตัวแปรโกลบอล
เหตุใดคุณสมบัติโกลบอลจึงสามารถแจกแจงได้ แต่ตัวแปรโกลบอลไม่สามารถทำได้ ประสบการณ์บอกเราว่า JScript ทำเครื่องหมายตัวแปรโกลบอล (ประกาศด้วย var) เป็น DontEnum เนื่องจากวัตถุโกลบอลถูกกำหนดให้เป็นวัตถุตัวแปรโกลบอล นี่ดูเหมือนเป็นคำอธิบายที่สมเหตุสมผล นี่ไม่ใช่มาตรฐาน แต่อธิบายพฤติกรรมใน IE อย่างไรก็ตาม Eric Lippert เสนอคำอธิบายอื่น: อ็อบเจ็กต์โกลบอลและอ็อบเจ็กต์ตัวแปรโกลบอลเป็นอ็อบเจ็กต์ที่แตกต่างกันสองรายการใน IE
ตาม MS-ES3:
การประกาศตัวแปรใน JScript 5.x จะสร้างคุณสมบัติของอ็อบเจ็กต์โกลบอลซึ่งมีแอตทริบิวต์ DontEnum