Bir fark var .
var x = 1
x
geçerli kapsamda değişken olarak bildirir (yürütme bağlamı olarak da bilinir). Bildirim bir işlevde görünüyorsa - yerel bir değişken bildirilir; küresel kapsamda ise - global bir değişken bildirilir.
x = 1
Öte yandan, sadece bir mülk atamasıdır. Önce x
kapsam zincirine karşı çözüm bulmaya çalışır . Bu kapsam zincirinde herhangi bir yerde bulursa, atama gerçekleştirir; bulamazsa x
, ancak o zaman genel bir nesnede (bir kapsam zincirinde en üst düzey bir nesne olan) özellik oluştururx
.
Şimdi, global değişken bildirmediğine, global bir özellik oluşturduğuna dikkat edin.
İkisi arasındaki fark anlaşılır ve değişken bildirimlerin de özellikler (yalnızca Değişken Nesnede) oluşturduğunu ve Javascript'teki (well, ECMAScript) her özelliğin özelliklerini tanımlayan belirli bayrakları olduğunu anlamadığınız sürece kafa karıştırıcı olabilir - ReadOnly, DontEnum ve DontDelete.
Değişken bildirimi DontDelete bayrağıyla özellik oluşturduğundan, var x = 1
ve x = 1
(global kapsamda yürütüldüğünde) arasındaki fark, eski değişken değişken bildiriminin DontDelete'able özelliğini oluşturması ve ikincisinin oluşturmamasıdır. Sonuç olarak, bu örtük atama ile oluşturulan özellik genel nesneden silinebilir ve birincisi - değişken bildirimi ile oluşturulan özellik - silinemez.
Ancak bu sadece elbette teoridir ve pratikte, uygulamalardaki çeşitli hatalar (IE'den gelenler gibi) nedeniyle ikisi arasında daha fazla fark vardır .
Umarım her şey mantıklıdır :)
[Güncelleme 2010/12/16]
ES5'te (ECMAScript 5; son zamanlarda standartlaştırılmış, dilin 5. sürümü), "katı mod" olarak adlandırılır - kayıt dışı atamaların davranışını biraz değiştiren bir tercihli dil modu. Katı modda, bildirilmemiş bir tanımlayıcıya atama ReferenceError olur . Bunun mantığı, istenmeyen küresel özelliklerin yaratılmasını önleyerek, yanlışlıkla yapılan ödevleri yakalamaktı. Bazı yeni tarayıcılar katı mod için destek vermeye başladı bile. Örneğin, uyumlu tabloma bakın .