Ini adalah artikel tentang debugging dengan JScript RuntimeObject (MSDN). Meskipun sebagian besar contoh ini tidak berfungsi di browser lain, namun akan berfungsi di IE 5.5+.
Pengenal global yang bocor
Misalnya, Anda secara tidak sengaja membuat properti global, seperti:
fungsi playRugby(pemain) {
item var,
Saya;
len = item.panjang;
// Global.
}
fungsi tendangan() {
var x = 10
kamu = 11;
// Saat aku menjadikanmu global.
}
Saat playRugby dipanggil, properti global len dibuat, dan jika properti tersebut belum ada, nilai items.length akan ditetapkan padanya. Demikian pula, ketika kick dipanggil, properti global y dibuat.
Tak satu pun dari variabel global ini disengaja. Mereka merusak enkapsulasi dan mengungkapkan detail implementasi. Hal ini dapat menyebabkan konflik dan masalah ketergantungan yang rumit.
Untuk mendeteksi pengidentifikasi global yang dibuat secara tidak sengaja ini, kita dapat menggunakan perulangan for in pada objek global. Tag "DOM" Firebug menyediakan deteksi global yang berguna ini.
Sayangnya, di IE, for in tidak dapat menyebutkan variabel global dan deklarasi fungsi apa pun. Lihatlah contoh berikut:
// Properti objek variabel global.
var EX1_GLOBAL_VARIABLE = 10;
// Properti objek global.
ini.EX1_GLOBAL_PROPERTY = 11;
// Properti objek variabel global.
fungsi EX1_GLOBAL_FUNCTION(){}
(fungsi(){
var hasil = [];
untuk(var p dalam ini) {
hasil.push(p);
}
alert("Bocor:n" + hasil.join("n"));
})();
Di IE, hasilnya berisi kombinasi properti jendela dan salah satu dari empat properti yang ditentukan pengguna: EX1_GLOBAL_PROPERTY.
Jadi, apa yang terjadi dengan tiga properti buatan pengguna lainnya? Mengapa mereka tidak muncul di loop for in.
Ternyata menghitung objek global menghitung properti objek global yang ditetapkan tetapi tidak menghitung variabel global.
Mengapa properti global dapat disebutkan tetapi variabel global tidak bisa. Pengalaman memberi tahu kita bahwa JScript menandai variabel global (dideklarasikan dengan var) sebagai DontEnum. Karena objek global didefinisikan sebagai objek variabel global, sepertinya penjelasan ini masuk akal. Ini bukan standar tetapi menjelaskan perilaku di IE. Namun, Eric Lippert mengajukan penjelasan lain: objek global dan objek variabel global adalah dua objek berbeda di IE.
Menurut MS-ES3:
Deklarasi variabel di JScript 5.x membuat properti objek global, yang memiliki atribut DontEnum.