Există o diferență.
var x = 1
declară variabila x
în domeniul curent (alias contextul de execuție). Dacă declarația apare într-o funcție - este declarată o variabilă locală; dacă este în domeniul global - este declarată o variabilă globală.
x = 1
, pe de altă parte, este doar o atribuire de proprietate. Mai întâi încearcă să rezolve x
împotriva lanțului scope. Dacă îl găsește oriunde în lanțul respectiv, efectuează atribuirea; dacă nu găsește x
, numai atunci creează proprietatea x
pe un obiect global (care este un obiect de nivel superior într-un lanț de domeniu).
Acum, observați că nu declară o variabilă globală, ci creează o proprietate globală.
Diferența dintre cele două este subtilă și poate fi confuză, dacă nu înțelegeți că declarațiile de variabile creează și proprietăți (numai pe un obiect variabil) și că fiecare proprietate din Javascript (ei bine, ECMAScript) are anumite steaguri care descriu proprietățile lor - ReadOnly, DontEnum și DontDelete.
Deoarece declarația variabilei creează o proprietate cu indicatorul DontDelete, diferența dintre var x = 1
și x = 1
(când este executată în sfera globală) este că prima - declarația variabilei - creează proprietatea DontDelete, iar cea din urmă nu. În consecință, proprietatea creată prin această atribuire implicită poate fi apoi ștearsă din obiectul global, iar cea dintâi - cea creată prin declararea variabilei - nu poate fi ștearsă.
Dar aceasta este doar teorie, desigur, iar în practică există și mai multe diferențe între cele două, din cauza diferitelor erori în implementări (cum ar fi cele de la IE).
Sper ca totul are sens :)
[Actualizare 2010/12/16]
În ES5 (ECMAScript 5; standardizat recent, ediția a 5-a a limbajului) există așa-numitul „mod strict” - un mod de limbă opt-in, care modifică ușor comportamentul sarcinilor nedeclarate. În modul strict, atribuirea unui identificator nedeclarat este o ReferenceError. Motivul pentru aceasta a fost de a surprinde sarcini accidentale, prevenind crearea de proprietăți globale nedorite. Unele dintre browserele mai noi au început deja să accepte modul strict. Vedeți, de exemplu, my compat table.
person
kangax
schedule
24.09.2009
const
șilet
în schimb!var
nu este JS modern - person Gibolt   schedule 15.08.2017let
în loc devar
(datorită diferențelor în modul în care se comportălet
șivar
). - person Quentin   schedule 19.12.2019