2011-08-10 7 views
5

Nie mogę zrozumieć, dlaczego window jest pod self, a self jest pod obiektem window.Dziwny obiekt własny w obiekcie okna

jeśli przejdziesz do dev-tools lub Firebug i napisz window masz obiekt DOM window, który pod tym obiektem jest self. Dziwne jest to, że window znów jest pod self!

Możesz napisać

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 

i nadal masz window obiekt!

Jak ?!

+0

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

+0

Więc nie widziałeś już wcześniej autoreferencji? Jest to dość powszechne na przykład w modelu singleton, a ponieważ javascript nie ma bezpośrednich zmiennych prywatnych, możesz mieć do niego dostęp w nieskończoność ... Nie mówię tego "JEST" w tym przypadku, ale przypadek użycia lub wyjaśnienie, dlaczego może to być – PhD

+0

To jest obiekt, nie funkcja. nawet jeśli istnieje metoda autoreferencji do tworzenia obiektów w JavaScript, byłbym bardziej niż szczęśliwy, aby się tego nauczyć. – Mohsen

Odpowiedz

5

W odpowiedzi na jedno z moich uwag:

Jest to odwołanie cykliczne, więc to nie koniec. Tylko kompilator tworzy jedno odniesienie. Jest to po prostu odniesienie do oryginalnego obiektu, na którym utworzono referencję. Dlatego możesz zrobić window.window.window ... Tak jak to: var obj = {}; obj.obj = obj ;. Utworzono tylko jedno odwołanie, ale jest ono odniesieniem do oryginału , więc można wykonać obj.obj.obj.obj.obj.obj.obj === obj.

Komentarz można zobaczyć tutaj: Is window really global in Javascript?

+0

OK. var obj = {}, a następnie obj.obj = obj, ale jak o var obj = {}; obj.self = obj ;? Teraz obj.self.obj return undefined – Mohsen

+0

@Mohsen: 'self' jest właściwością' window'. 'window.self === okno'. Więc ma sens, że dostaniesz też 'window.self === window.self'. Komentarz w moim poście dotyczył tylko "window.window". – Shaz

+0

Czy wiesz, jak powielić coś takiego w JavaScript? "obiekt nadrzędny i samopisujący": - \ – Mohsen

1

Zobacz this page i see here. window.window jest odniesieniem do samego siebie, więc można powtórzyć window.window.window ... window, to zawsze zwróci bieżące okno. self zwraca odniesienie do bieżącego okna, więc tutaj jest takie samo, to zawsze zwróci obiekt DOMWindow.

+0

Dziękuję, że rozumiem, jak działa window.window.window za pośrednictwem łącza MDN. W jaki sposób tworzysz obiekt samodostarczający? – Mohsen

+0

@Mohsen zrobiłeś to w jednym z twoich innych komentarzy 'var obj = {}; obj.self = obj; '. Teraz, "obj.self == obj.self.self == obj.self.self.self == obj'. – Pointy

+0

tak, obj.self.self.self ... wygląda dobrze. ale ja nie mam w tym celu. więc obiekt obj.self.obj nie działa. (jak oznaczać kod w komentarzach ?!) – Mohsen