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.
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
nawindow
. -
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
.
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
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.
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.
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
}
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]
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