2010-09-03 7 views
29

Mam JavaScript, który zajmuje się wykrywanie, czy strona jest w ramkach, czy nie. Użyłem top.frames [] itd. I wszystko działa dobrze.Czym różni się okno od siebie?

W tym skrypcie zauważyłem, że mogę używać "okna" lub "siebie" zamiennie i wszystko nadal działa. Czy "okno" jest takie samo jak "ja", gdy jest używane na stronie HTML?

+6

Podczas korzystania z Web Workers self i window to nie to samo. Patrz [http://stackoverflow.com/questions/11219775/global-variable-in-web-worker][1] [1]: http://stackoverflow.com/questions/11219775/global -variable-in-web-worker – user1872904

Odpowiedz

15

Od javascript: The Definitive Guide:

Obiekt Okno określa liczbę właściwości i metody, które pozwalają manipulować okno przeglądarki internetowej. Definiuje również właściwości odnoszące się do innych ważnych obiektów, takich jak , do innych ważnych obiektów, takich jak dla obiektu dokumentu . Wreszcie, obiekt Window ma dwie własne właściwości , window i self. Użytkownik może użyć dowolnej zmiennej globalnej do odwołać się bezpośrednio do obiektu Window.

Krótko mówiąc, zarówno window i self są odniesienia do obiektu window, który jest globalny obiekt po stronie klienta JavaScript.

+0

Z wyjątkiem necro-bug, jeśli FF6.0, http://stackoverflow.com/a/7769187/139361, 'window' i' self' powinny być identyczne. Ktoś wie jakieś inne błędy? --------------------------------------- Muszę dodać, że używając 'self' jest mylące dla większości programistów javascript, więc zamiast tego użyj 'window'. – Dan

8

Oto wytłumaczenie i przykład z the MDN page for window.self:

if (window.parent.frames[0] != window.self) { 
    // this window is not the first frame in the list 
} 

window.self jest prawie zawsze używane w porównaniach jak w powyższym przykładzie, który dowiaduje się, czy bieżące okno jest pierwszą podramką w macierzystym zestawie ramek.

Biorąc pod uwagę, że nikt nie używa ramek te dni, myślę, że to jest w porządku, aby uznać, że nie istnieją żadne przypadki użyteczne dla self. Ponadto, przynajmniej w Firefox, testowanie pod window zamiast window.self jest równoważne.

+0

Dla kodu, który musi działać niezależnie od przeglądarki, wydaje się, że lepiej użyć 'self', tj. wykonanie bez głowy. – nilskp

+0

@nilskp, to interesujące, ale cię nie rozumiałem. Czy mógłbyś wyjaśnić? – Dan

+0

@Dan, 'okno' jest obecne tylko w GUI (przeglądarce). Nie wszystkie kody JavaScript działają w przeglądarce. W takich przypadkach 'self' nadal będzie działać, ale' window' nie będzie. – nilskp

6

self jest tylko do odczytu właściwość, że może być bardziej elastyczna niż, a czasami stosowane na korzyść, w window bezpośrednio. Dzieje się tak dlatego, że odwołanie self zmienia się w zależności od kontekstu operacyjnego (w przeciwieństwie do window.self, który istnieje tylko wtedy, gdy istnieje window). Jest także doskonały do ​​porównań, o czym wspominali inni.

Na przykład, jeśli używasz self wewnątrz Pracownik internetowej (która mieszka we własnym wątku tła), self rzeczywiście odwoływać WorkerGlobalScope.self. Jeśli jednak użyjesz trybu self w normalnym kontekście przeglądarki, po prostu zwrócisz odwołanie do Window.self (ten, który ma document, addEventListener() i wszystkie inne rzeczy, które przywykliście widzieć).

TL; DR natomiast .self w window.self nie będzie istnieć, jeśli window nie istnieje, za pomocą self z własnej woli do punktu Window.self w tradycyjnym kontekście okno/przeglądarki lub WorkerGlobalScope.self w kontekście pracownika internetowej.

Jak zwykle, MDN ma świetny zapis na ten temat in their JavaScript docs. :)


Notatka: Wykorzystanie self tutaj nie należy mylić ze wspólnym JS wzór deklarowania zmiennej lokalnej: var self = this utrzymania odniesienie do kontekstu po włączeniu.

Możesz przeczytać więcej na ten temat tutaj: Getting Out of Binding Situations in JavaScript.