2016-11-05 11 views
5

Google Chrome và Firebug cho tôi hai kết quả đầu ra khác nhau với ví dụ này.Javascript: Hai đầu ra khi không sử dụng từ khóa var

nếu b được toàn cầu, thì trước tiên sẽ cho tôi không xác định và thứ hai 14. phải không? nhưng trong firebug, nó cung cấp hai 14 giây và Chrome cung cấp lỗi tham chiếu.

function a() { 
     b = 14; 
} 
console.log(b); 
a(); 
console.log(b); 
+0

'b' không phải là toàn cầu trong mã của bạn. – melancia

+2

@MelanciaUK: Ở chế độ lỏng lẻo. Ở chế độ nghiêm ngặt, đó là 'Tham chiếu'. –

+1

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. –

Trả lời

6

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.

+0

Nó có hoạt động như thế này không? tại thời gian biên dịch, ** var b ** tăng (toàn cầu hóa). khi đó là thời gian để chạy chương trình, b, cho đầu ra đầu tiên đánh giá là ** không xác định ** và lần thứ hai 14. – Meysam

+1

@Meysam: Không có 'var b' trong mã của bạn, vì vậy không, đó không phải là cách mã đó công trinh. ** Nếu ** bạn có một 'var b' trong phạm vi toàn cục, nó sẽ hoạt động khác nhau, có. –

+1

@Meysam không có "thời gian biên dịch". Và bạn không có 'var b'. Và điều đó không làm cho 'b'" đi lên "như trong toàn cầu hóa - biến sẽ là _hoisted_ nhưng không lên phạm vi mà chỉ ở trên cùng của khai báo. – vlaz

3

Đầu tiên console.log() nên cung cấp tham chiếuError vì biến không được xác định tại thời điểm đó. Nếu nó hoạt động khác trong Firebug, thì đó là một lỗi trong Firebug.

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