Không sử dụng bảng điều khiển trình duyệt để thử nghiệm phạm vi. Các trình điều khiển trình duyệt khác nhau chạy mã của bạn theo nhiều cách khác nhau.
Nếu bạn chạy mã chính xác như được trích dẫn trong một môi trường bình thường, điều đúng là bạn sẽ nhận được một ReferenceError
từ console.log(b)
dòng đầu tiên:
function a() {
b = 14;
}
console.log(b); // ReferenceError
a();
console.log(b);
Ngay cả trong chế độ lỏng lẻo, cố gắng đọc giá trị của số nhận dạng không khai báo là ReferenceError
.
Nếu chúng ta loại bỏ ban đầu console.log
, chúng ta sẽ bị rơi vào một khu vực mà thay đổi tùy theo lỏng lẻo so với chế độ nghiêm ngặt:
// In loose mode
function a() {
b = 14;
}
a();
console.log(b); // 14
Đó là The Horror of Globals Implicit; ở chế độ lỏng lẻo, gán cho một số nhận dạng không khai báo sẽ tạo ra một biến toàn cục.
Vs.
// In strict mode
"use strict";
function a() {
b = 14; // ReferenceError
}
a();
console.log(b);
... đó là cách thực hiện.
Đó là một bài đăng trên blog chút thiếu máu của tôi.
Nguồn
2016-11-05 11:34:22
'b' không phải là toàn cầu trong mã của bạn. – melancia
@MelanciaUK: Ở chế độ lỏng lẻo. Ở chế độ nghiêm ngặt, đó là 'Tham chiếu'. –
Chỉ cần chạy điều này trong Firebug và đã cho tôi một lỗi tham khảo. Tôi quản lý để có được một undefined và 14 sau khi thêm 'var b;' lúc bắt đầu. –