Jaka jest różnica między globalnym var a oknem.zmienna w javascript?

Odczytuję kręgosłup.js dokumentuje i widzi dużo kodu, który przypisuje atrybuty obiektowi window:

window.something = "whatever";

Jaka jest różnica między wywołaniem tego kodu, a po prostu przypisaniem zmiennej i utworzeniem globalnego var, jak poniżej:

something = "whatever";

Zakładam, że jest jakiś inny zakres i/lub różnica własności obiektu (okno jest właścicielem vs Nie), ale interesuje mnie szczegóły między tymi dwoma i dlaczego miałbym używać window vs not use to.

Author: Derick Bailey, 2011-06-14

6 answers

Bez różnicy. Oba mają ten sam efekt (w przeglądarce, gdzie window jest globalnym kontekstem1).

  • window.foo = "bar" ustawia właściwość foo na window.
  • foo = "bar" oznacza albo literówkę albo celowo globalną.

Ponieważ muszę dokładnie sprawdzić, czy to literówka, czy nie, osobiście uważam, że bardziej czytelne ustawić window.foo bezpośrednio.

Również, w trybie ES5 strict, {[4] } jest nielegalnym przypisaniem, ponieważ foo nie jest zadeklarowane i rzuci Error.

Edit:

Jak wspomniano w komentarzach, foo = "bar" przejrzy cały łańcuch zakresu dla zmiennej foo i przypisze ją ponownie za pomocą "bar", jeśli zostanie znaleziona. Jeśli nie zostanie znaleziona, utworzy nową zmienną globalną.

Również z window.foo = "bar" przypisujesz właściwość obiektowi, który można usunąć za pomocą delete window.foo.

W trybie ES5 strict jest to niepoprawne do delete a zmienna.


1 w innych środowiskach, takich jak node.js i Web Workers, może być inna nazwa dla obiektu globalnego i window może w ogóle nie istnieć. Węzeł.js używa global i Web Workers używać self.

 75
Author: Raynos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-24 19:14:11

Oboje robią to samo.
Ale uzyskując dostęp do Właściwości window, masz pewność, że uzyskujesz dostęp do zmiennej globalnej bez względu na to, w jakim zakresie się znajdujesz.
Na przykład:

globalVar = "smth";
function(){
    var globalVar = 2;
    alert(globalVar);// points to the current scope globalVar
    alert(window.globalVar);// points to the original globalVar
}
Innymi słowy, jeśli chcesz pracować z globalami, bezpieczniej jest uzyskać do nich dostęp poprzez ich kontener : window.variable
 10
Author: gion_13,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-20 14:17:46

Klucz, o którym wspomniał Raynos, polega na tym, że jest ustawiony jawnie na obiekcie window. W przeglądarce obiekt globalny jest taki sam jak obiekt window, ale w innych środowiskach (np. węzeł.js, a może działa w widoku sieci Web jakiegoś rodzaju na urządzeniu mobilnym), może nie.

 5
Author: ScottKoon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-14 20:04:43

Różnica polega na tym, że window.foo = bar; nie może zostać przechwycona przez refaktoryzację wykonaną później. Użycie foo = bar; oznacza, że jeśli w późniejszym terminie kod zostanie przeniesiony do zamknięcia, w którym zdefiniowano var foo, nie będzie już ustawiał go na obiekcie globalnym.

 2
Author: david,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-14 19:58:39

dodanie jeszcze jednego punktu:

Jeśli polecisz niezgłoszoną zmienną bezpośrednio (bez użycia - window lub typeof), otrzymasz zmienną nie zdefiniowaną błąd.

Przykłady:

// var unDecVariable

if (unDecVariable != null) // Error: unDecVariable is not defined
{
    // do something
}

if (window.unDecVariable != null) // No Error
{
    // do something
}

if (typeof unDecVariable != 'undefined' && unDecVariable != null) // Alternative way
{
    // do something
}
 0
Author: SridharKritha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-05 16:30:21

Nierozwiązane odwołania (aka nierejestrowane zmienne) w rzeczywistości nie są zmiennymi, są dodawane jako właściwość do obiektu globalnego. [5c]

W trybie strict ("use strict"), nierozwiązane odwołania rzucają ReferenceError. Ma to na celu uniknięcie dodawania do obiektu globalnego właściwości, które miały być zadeklarowanymi zmiennymi. W takim przypadku, jeśli chcesz dodać właściwość do obiektu globalnego, użyj window.foo = "bar". [5a]

 0
Author: bee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-04 10:11:33