2012-04-11 25 views
6

Trong javascriptwindow là đối tượng chung, có nghĩa là mọi đối tượng trong phạm vi toàn cầu là con của window. Vậy tại sao tôi nhận được kết quả này:Tham chiếuMỗi và đối tượng chung

console.log(window.foo); // No error, logs "undefined". 
console.log(foo);  // Uncaught ReferenceError: foo is not defined. 

Fiddle

Hai dòng nên được như vậy, không nên họ?

Trả lời

17

Vì với window.foo, bạn đang tìm kiếm một cách rõ ràng foo thuộc tính của đối tượng window không phải là trường hợp trong tùy chọn thứ hai. Trong tùy chọn thứ hai, nếu foo không được xác định, bạn nên làm nhà phát triển có thể biết rằng nó không được xác định và nhận được cảnh báo lỗi rõ ràng hơn là thông dịch viên tự đặt nó thành undefined (như trường hợp đầu tiên) đến bất ngờ kết quả.

Reference Error:

Đại diện một lỗi khi một biến không tồn tại được tham chiếu. Một tham chiếuError được ném khi cố gắng dereference một biến chưa được khai báo.

Hãy nhìn vào bài viết này để biết thêm:

Trích dẫn từ trên bài viết:

Một tham khảo được coi là không thể giải quyết nếu giá trị cơ bản của nó không được xác định. Do đó, tham chiếu thuộc tính không thể giải quyết được nếu giá trị trước dấu chấm không được xác định. Ví dụ sau đây sẽ ném một ReferenceError nhưng nó không phải vì TypeError đến đó trước. Điều này là do giá trị cơ sở của một thuộc tính phải chịu sự kiểm tra của CheckObjectCoercible (ECMA 5 9.10 thông qua 11.2.1) mà ném một TypeError khi cố gắng chuyển đổi kiểu Undefined thành một đối tượng.

Ví dụ:

var foo; 
foo.bar; //TypeError (base value, foo, is undefined) 
bar.baz; //ReferenceError (bar is unersolvable) 
undefined.foo; //TypeError (base value is undefined) 

Tài liệu tham khảo mà không phải là tài sản hoặc biến là theo định nghĩa không thể giải quyết và sẽ ném một ReferenceError, Vì vậy:

foo; //ReferenceError 
2

Trong ví dụ đầu tiên của bạn (window.foo), bạn đang truy cập thuộc tính của đối tượng cửa sổ. JavaScript trả về "không xác định" cho khi bạn đang cố truy cập một thuộc tính không tồn tại của một đối tượng. Nó được thiết kế theo cách đó.

Trong ví dụ thứ hai, bạn đang tham chiếu một biến trực tiếp và vì nó không tồn tại một lỗi được nêu ra.

Đó chỉ là cách JavaScript được thiết kế và hoạt động.

1

Trong JavaScript bạn có thể gán trường đối tượng đang bay như vậy, vì vậy, window.foogần (xem các nhận xét bên dưới) tương đương với var foo;khi được xác định trong bối cảnh chung, trong khi chỉ cần gọi foo ngoài màu xanh làm cho trình duyệt hoảng sợ vì không biết phải nhìn vào đối tượng nào. Thông báo, nếu bạn làm như vậy:

//when in global context, 'var' sets a property on the window object 
var foo; 

console.log(foo); 
//it will then also log `undefined` instead of throwing the error. 

//if you then do: 
foo = "abbazabba"; 

console.log(window.foo); 
// it will return "abbazabba" 
+1

'window.foo' không tương đương với' var foo'. –

+0

@TimDown. bạn có thể xây dựng thêm một số chi tiết không? có lẽ trong một câu trả lời? – gdoron

+0

@TimDown & @gdoron Được rồi, đó là một chút không đúng - ý tôi là window.foo tương đương với 'var foo' khi được khai báo trong ngữ cảnh chung. – JKing

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