Ponieważ z window.foo
wyraźnie poszukujesz foo
właściwości obiektu window
, co nie ma miejsca w przypadku drugiej opcji. W tej drugiej opcji, jeśli foo
nie jest zdefiniowany, powinieneś jako deweloper wiedzieć, że nie jest on zdefiniowany i otrzymać jednoznaczne ostrzeżenie o błędzie, a nie interpreter ustawiając go na undefined
sam (jak pierwszy przypadek), który będzie prowadził do nieoczekiwanych wyników.
Reference Error:
reprezentuje błąd, gdy zmienna nieistniejące odwołuje. Wywołanie ReferenceError jest zgłaszane podczas próby wyodrębnienia zmiennej, która nie została zadeklarowana.
Spójrz na ten artykuł, aby uzyskać więcej informacji:
Cytując powyższy artykuł:
mowa jest uważany nierozwiązywalne jeśli jego wartość bazowa jest niezdefiniowany. Dlatego odniesienie do właściwości jest nierozwiązywalne, jeśli wartość przed kropką jest niezdefiniowana. Poniższy przykład powodowałby błąd ReferenceError, ale nie wynika z tego, że TypeError dostanie się tam jako pierwszy. Wynika to z faktu, że podstawowa wartość właściwości podlega CheckObjectCoetable (ECMA 5 9.10 do 11.2.1), która wyrzuca TypeError przy próbie przekształcenia niezdefiniowanego typu w obiekt.
Przykłady:
var foo;
foo.bar; //TypeError (base value, foo, is undefined)
bar.baz; //ReferenceError (bar is unersolvable)
undefined.foo; //TypeError (base value is undefined)
Odniesienia, które nie są ani właściwości lub zmienne są z definicji nierozwiązywalne i rzuci ReferenceError, So:
foo; //ReferenceError
'window.foo' nie jest równoważne' var foo'. –
@TimDown. czy możesz jeszcze trochę więcej rozwinąć? może w odpowiedzi? – gdoron
@TimDown & @gdoron Okay, to trochę nieprawda - chodziło mi o to, że window.foo jest równoważne 'var foo', gdy jest zadeklarowane w kontekście globalnym. – JKing