2011-08-10 47 views
5

Tôi không thể hiểu tại sao window là dưới selfself là dưới đối tượng window.Đối tượng lạ tự trong đối tượng cửa sổ

nếu bạn truy cập công cụ dành cho nhà phát triển hoặc Firebug và viết window bạn nhận được DOM window đối tượng self nằm trong đối tượng này. Phần kỳ lạ là window là dưới self một lần nữa!

Bạn có thể viết

window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self 

và bạn vẫn có được window đối tượng!

Làm thế nào ?!

+0

Xem http://stackoverflow.com/questions/6145544/self-document-this-top-window – Shaz

+0

Vì vậy, bạn chưa thấy tự tham khảo trước đây? Nó khá phổ biến trong mẫu đơn ví dụ và vì javascript thiếu các biến riêng tư trực tiếp, bạn có thể truy cập vào quảng cáo đó ... Tôi không nói trường hợp này là "IS", nhưng là trường hợp sử dụng hoặc giải thích lý do tại sao nó có thể là – PhD

+0

Đây là một đối tượng không phải là một hàm. ngay cả khi có một đối tượng tự tham chiếu tạo phương thức trong JavaScript, tôi sẽ rất vui khi biết điều đó. – Mohsen

Trả lời

5

Trong một phản ứng với một trong những ý kiến ​​của tôi:

Đó là một tham chiếu vòng tròn, vì vậy nó không kết thúc. Trình biên dịch chỉ tạo một tham chiếu. Nó chỉ xảy ra là một tham chiếu về đối tượng gốc mà trên đó tham chiếu đã được tạo. Đó là lý do tại sao bạn có thể làm window.window.window ... Như sau: var obj = {}; obj.obj = obj ;. Chỉ có một tham chiếu được tạo nhưng đó là tham chiếu về số gốc, vì vậy bạn có thể thực hiện obj.obj.obj.obj.obj.obj.obj === obj.

luận có thể được nhìn thấy ở đây: Is window really global in Javascript?

+0

OK. var obj = {} và sau đó obj.obj = obj nhưng làm thế nào về var obj = {}; obj.self = obj ;? Bây giờ obj.self.obj trả về undefined – Mohsen

+0

@Mohsen: 'self' là thuộc tính của' window'. 'window.self === window'. Vì vậy, nó có ý nghĩa bạn cũng sẽ nhận được 'window.self === window.self'. Nhận xét trong bài viết của tôi chỉ đề cập đến 'window.window'. – Shaz

+0

Bạn có biết làm thế nào để tái tạo một cái gì đó như thế này trong JavaScript? "cha mẹ và tự tham chiếu đối tượng": - \ – Mohsen

1

Xem this page, và see here. window.window là một tham chiếu đến chính nó, vì vậy bạn có thể lặp lại window.window.window ... window, nó sẽ allways trở lại cửa sổ hiện hành. self trả về một tham chiếu đến cửa sổ hiện tại, vì vậy ở đây nó giống nhau, nó sẽ được trả về đối tượng DOMWindow.

+0

Cảm ơn bạn Tôi hiểu cách window.window.window hoạt động thông qua liên kết MDN. Vì vậy, làm thế nào bạn thực hiện một đối tượng tự tham khảo? – Mohsen

+0

@Mohsen bạn đã làm điều đó trong một trong các nhận xét khác của bạn 'var obj = {}; obj.self = obj; '. Bây giờ, 'obj.self == obj.self.self == obj.self.self.self == obj'. – Pointy

+0

vâng, obj.self.self.self ... có vẻ đúng. nhưng không có obj trong đó. obj.self.obj không hoạt động. (cách bạn đánh dấu mã trong các bình luận ?!) – Mohsen

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