Jest różnica .
var x = 1
deklaruje zmienną x
w bieżącym zakresie (inaczej kontekst wykonania). Jeśli deklaracja pojawia się w funkcji - deklarowana jest zmienna lokalna; jeśli ma zasięg globalny - deklarowana jest zmienna globalna.
x = 1
z drugiej strony jest jedynie przeniesieniem własności. Najpierw próbuje rozwiązać problem x
z łańcuchem zakresu. Jeśli znajdzie go gdziekolwiek w tym łańcuchu zasięgu, wykonuje przypisanie; jeśli nie znajdzie x
, tylko wtedy tworzy x
właściwość na obiekcie globalnym (który jest obiektem najwyższego poziomu w łańcuchu zasięgu).
Zauważ, że nie deklaruje zmiennej globalnej, lecz tworzy właściwość globalną.
Różnica między nimi jest subtelna i może być myląca, chyba że zrozumiesz, że deklaracje zmiennych również tworzą właściwości (tylko na obiekcie zmiennym) i że każda właściwość w JavaScript (cóż, ECMAScript) ma pewne flagi opisujące ich właściwości - ReadOnly, DontEnum i DontDelete.
Ponieważ deklaracja zmiennej tworzy właściwość z flagą DontDelete, różnica między var x = 1
i x = 1
(gdy jest wykonywana w zasięgu globalnym) polega na tym, że pierwsza deklaracja - zmienna - tworzy właściwość DontDelete, a druga nie. W konsekwencji właściwość utworzona za pomocą tego niejawnego przypisania można następnie usunąć z obiektu globalnego, a poprzednia - ta utworzona za pomocą deklaracji zmiennej - nie może zostać usunięta.
Ale to oczywiście tylko teoria, aw praktyce istnieją między nimi jeszcze więcej różnic , z powodu różnych błędów we wdrożeniach (takich jak te z IE).
Mam nadzieję, że to wszystko ma sens :)
[Aktualizacja 2010/12/16]
W ES5 (ECMAScript 5; ostatnio znormalizowana, 5. edycja języka) znajduje się tak zwany „tryb ścisły” - opcjonalny tryb językowy, który nieznacznie zmienia zachowanie niezadeklarowanych zadań. W trybie ścisłym przypisanie do niezadeklarowanego identyfikatora to ReferenceError . Uzasadnieniem tego było złapanie przypadkowych zleceń, zapobiegając tworzeniu niepożądanych globalnych właściwości. Niektóre z nowszych przeglądarek już zaczęły obsługiwać tryb ścisły. Zobacz na przykład moją tabelę zgodności .