Dengan kode ini:
function baz() {
var x = "foo";
function bar() {
debugger;
};
bar();
}
baz();
Saya mendapatkan hasil yang tidak terduga ini:
Ketika saya mengubah kode:
function baz() {
var x = "foo";
function bar() {
x;
debugger;
};
bar();
}
Saya mendapatkan hasil yang diharapkan:
Juga, jika ada panggilan ke eval
dalam fungsi dalam, saya dapat mengakses variabel saya seperti yang saya ingin lakukan (tidak peduli apa yang saya berikan eval
).
Sementara itu, alat pengembang Firefox memberikan perilaku yang diharapkan dalam kedua keadaan.
Ada apa dengan Chrome yang berperilaku debugger kurang nyaman daripada Firefox? Saya telah mengamati perilaku ini selama beberapa waktu, hingga dan termasuk Versi 41.0.2272.43 beta (64-bit).
Apakah itu mesin javascript Chrome "meratakan" fungsi ketika itu bisa?
Menariknya jika saya menambahkan variabel kedua yang adalah direferensikan dalam fungsi batin, x
variabel masih terdefinisi.
Saya mengerti bahwa sering ada quirks dengan cakupan dan definisi variabel ketika menggunakan debugger interaktif, tetapi menurut saya berdasarkan spesifikasi bahasa seharusnya ada solusi "terbaik" untuk quirks ini. Jadi saya sangat ingin tahu apakah ini karena Chrome lebih mengoptimalkan daripada Firefox. Dan juga apakah optimasi ini dapat dengan mudah dinonaktifkan selama pengembangan (mungkin mereka harus dinonaktifkan ketika alat dev terbuka?).
Juga, saya dapat mereproduksi ini dengan breakpoints serta debugger
pernyataannya.
debugger;
garis itu sebenarnya tidak dipanggil dari dalam bar
. Jadi lihat jejak stack ketika ia berhenti di debugger: Apakah bar
fungsi disebutkan dalam stacktrace? Jika saya benar, maka stacktrace seharusnya mengatakan itu dijeda pada baris 5, pada baris 7, pada baris 9.
temp1
dilampirkan ke konsol dan Anda dapat menggunakannya untuk mengakses entri lingkup.