Jest różnica.
var x = 1
deklaruje zmienną x
w bieżącym zakresie (czyli kontekście wykonania). Jeżeli deklaracja występuje w funkcji - deklarowana jest zmienna lokalna; jeśli ma zasięg globalny - deklarowana jest zmienna globalna.
x = 1
jest natomiast jedynie przeniesieniem własności. Najpierw próbuje rozwiązać x
względem łańcucha zasięgu. Jeśli znajdzie go gdziekolwiek w tym łańcuchu zasięgu, wykonuje przypisanie; jeśli nie znajdzie x
, dopiero wtedy tworzy właściwość x
na obiekcie globalnym (który jest obiektem najwyższego poziomu w łańcuchu zasięgu).
Teraz zauważ, że nie deklaruje zmiennej globalnej, tworzy właściwość globalną.
Różnica między nimi jest subtelna i może być myląca, chyba że zrozumiesz, że deklaracje zmiennych tworzą również właściwości (tylko w obiekcie Variable) i że każda właściwość w JavaScript (no 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 pomiędzy var x = 1
i x = 1
(gdy jest wykonywana w zakresie globalnym) polega na tym, że pierwsza - deklaracja zmiennej - tworzy właściwość DontDelete'able, a druga nie. W rezultacie właściwość utworzoną poprzez to niejawne przypisanie można następnie usunąć z obiektu globalnego, natomiast tej pierwszej, utworzonej poprzez deklarację zmiennej, nie można usunąć.
Ale to oczywiście tylko teoria i w praktyce różnic między nimi jest jeszcze więcej z powodu różnych błędów w implementacjach (takich jak te z IE).
Mam nadzieję, że to wszystko ma sens :)
[Aktualizacja 2010/12/16]
W ES5 (ECMAScript 5; niedawno ujednolicony, 5. wydanie języka) istnieje tak zwany „tryb ścisły” — tryb języka opcjonalny, który nieznacznie zmienia zachowanie niezadeklarowanych przypisań. W trybie ścisłym przypisanie do niezadeklarowanego identyfikatora jest ReferenceError. Powodem tego było wyłapanie przypadkowych przypisań, zapobiegając tworzeniu niepożądanych właściwości globalnych. Niektóre z nowszych przeglądarek rozpoczęły już obsługę trybu ścisłego. Zobacz na przykład moją tabelę zgodności.
person
kangax
schedule
24.09.2009
const
ilet
!var
nie jest nowoczesnym JS - person Gibolt   schedule 15.08.2017let
zamiastvar
(ze względu na różnice w zachowaniulet
ivar
). - person Quentin   schedule 19.12.2019