6
if(true) { 
    let m = "yo"; 

    console.log(m); 
} 

console.log(m) 

Output:Thứ tự thực thi JavaScript: tại sao điều này lại có hiệu lực sau khi mã theo sau nó?

ReferenceError: m is not defined 
yo 

Vì vậy, các mã trên dòng 4 đang được thực hiện sau khi mã trên dòng 8.

Liệu việc sử dụng của tôi let đã bất cứ điều gì để làm với điều này?

EDIT: Sau khi đọc nhận xét, tôi nhận ra rằng điều này có thể là do thời gian chạy của tôi. Đây là cách tôi nhìn thấy nó trong Firefox đêm:

firefox nightly let m

EDIT 2: Nếu điều này thực sự chỉ là thời gian chạy của tôi, sau đó là có ý nghĩa đối với mã sản xuất vì một cái gì đó như thế này? Hành vi không nhất quán giữa các trình duyệt? Làm thế nào để tôi chống lại điều đó?

+0

Bạn đang chạy ứng dụng này trong Chrome? – Ben

+1

[Tôi không thể sao chép điều đó.] (Http://jsfiddle.net/nxzt5npp/) - và tôi đang xem nó trong phiên bản FF dev. – Andy

+0

Tôi nhận được hành vi này trong Firefox Hàng đêm, bảng điều khiển. –

Trả lời

2

Vì vậy, tôi nghĩ rằng hành vi của thời gian chạy FF là OK. Một lướt qua lướt qua các spec (6.2.3.1 vv) chỉ ra rằng mã nên chạy từng dòng, cho đến khi console.log(m) thứ hai tại thời điểm đó một ReferenceError được ném.

Tôi nghi ngờ nó chỉ "trông buồn cười" vì thứ tự mà giao diện điều khiển chọn để hiển thị console.log đầu tiên và thông báo ngoại lệ (đó là nghịch đảo của Chrome chẳng hạn).

Liệu thứ tự hiển thị cho bảng điều khiển có bị coi là lỗi hay không, tôi để lại cho người khác.

Sau đây xuất hiện để xác nhận phân tích của tôi với cảnh báo hiển thị trước khi ngoại lệ được ghi lại.

if(true) { 
    let m = "yo"; 

    alert(m); 
} 

console.log(m) 
+0

Bạn có thể xác nhận rằng đây là lỗi không? Tôi không có kiến ​​thức để suy ra những gì bạn đang nói [Tôi thực sự cảm thấy khó nắm bắt :-)]. Có lẽ tôi nên nộp báo cáo? –

+0

Tôi sẽ phải kiểm tra lỗi tham chiếu tham khảo lại – Ben

+2

@adityamenon Ném lỗi tham chiếu * sớm * và không thực hiện 'if' và' console.log' ở tất cả * sẽ * đã là lỗi. Mã này có vẻ thực thi tốt, nhật ký được in sau khi lỗi gây nhầm lẫn nhưng có thể được bảo vệ bởi việc thực hiện đối tượng 'console'. Có, bạn nên gửi một lỗi vì hành vi này là khá bất ngờ, nhưng không phải với tuân thủ ES6 mà là thành phần devtools. (Và sau khi bạn đã làm như vậy, xin vui lòng liên kết nó ở đây) – Bergi

Các vấn đề liên quan