Với mã này:
function baz() {
var x = "foo";
function bar() {
debugger;
};
bar();
}
baz();
Tôi nhận được kết quả bất ngờ này:
Khi tôi thay đổi mã:
function baz() {
var x = "foo";
function bar() {
x;
debugger;
};
bar();
}
Tôi nhận được kết quả mong đợi:
Ngoài ra, nếu có bất kỳ lệnh gọi nào eval
bên trong hàm bên trong, tôi có thể truy cập vào biến của mình như tôi muốn làm (không quan trọng tôi chuyển đến cái gì eval
).
Trong khi đó, các công cụ dev của Firefox đưa ra hành vi dự kiến trong cả hai trường hợp.
Có chuyện gì với Chrome mà trình gỡ lỗi hoạt động kém thuận tiện hơn Firefox? Tôi đã quan sát hành vi này một thời gian, lên đến và bao gồm cả Phiên bản 41.0.2272.43 beta (64-bit).
Có phải công cụ javascript của Chrome "làm phẳng" các chức năng khi có thể?
Thật thú vị nếu tôi thêm một biến thứ hai được tham chiếu trong hàm bên trong, x
biến vẫn không được xác định.
Tôi hiểu rằng thường có các quirks có phạm vi và định nghĩa biến khi sử dụng trình gỡ lỗi tương tác, nhưng đối với tôi, dựa trên đặc tả ngôn ngữ nên có một giải pháp "tốt nhất" cho các quirks này. Vì vậy, tôi rất tò mò nếu điều này là do Chrome tối ưu hóa hơn Firefox. Và cũng có thể dễ dàng vô hiệu hóa các tối ưu hóa này trong quá trình phát triển hay không (có lẽ chúng nên bị vô hiệu hóa khi các công cụ dev được mở?).
Ngoài ra, tôi có thể tái tạo điều này với các điểm dừng cũng như debugger
tuyên bố.
debugger;
dòng không thực sự được gọi từ bên trong bar
. Vì vậy, hãy nhìn vào dấu vết ngăn xếp khi nó tạm dừng trong trình gỡ lỗi: bar
Hàm có được đề cập trong stacktrace không? Nếu tôi đúng, thì stacktrace sẽ nói rằng nó đã tạm dừng ở dòng 5, ở dòng 7, ở dòng 9.
temp1
được gắn vào bàn điều khiển và bạn có thể sử dụng nó để truy cập vào phạm vi.