Ada perbedaan .
var x = 1
mendeklarasikan variabel x
dalam lingkup saat ini (alias konteks eksekusi). Jika deklarasi muncul dalam suatu fungsi - variabel lokal dideklarasikan; jika itu dalam lingkup global - variabel global dideklarasikan.
x = 1
, di sisi lain, hanyalah penugasan properti. Pertama kali mencoba untuk menyelesaikan x
terhadap rantai ruang lingkup. Jika menemukannya di mana saja dalam rantai lingkup itu, ia melakukan tugas; jika tidak ditemukan x
, barulah ia menciptakan x
properti pada objek global (yang merupakan objek tingkat atas dalam rantai lingkup).
Sekarang, perhatikan bahwa itu tidak mendeklarasikan variabel global, itu menciptakan properti global.
Perbedaan antara keduanya adalah halus dan mungkin membingungkan kecuali Anda memahami bahwa deklarasi variabel juga membuat properti (hanya pada Objek Variabel) dan bahwa setiap properti di Javascript (yah, ECMAScript) memiliki flag tertentu yang menggambarkan properti mereka - ReadOnly, DontEnum dan DontDelete.
Karena deklarasi variabel membuat properti dengan flag DontDelete, perbedaan antara var x = 1
dan x = 1
(ketika dieksekusi dalam lingkup global) adalah bahwa deklarasi satu - variabel - menciptakan properti DontDelete'able, dan yang terakhir tidak. Sebagai akibatnya, properti yang dibuat melalui penugasan implisit ini kemudian dapat dihapus dari objek global, dan yang pertama - yang dibuat melalui deklarasi variabel - tidak dapat dihapus.
Tapi ini hanya teori saja, dan dalam praktiknya ada lebih banyak perbedaan di antara keduanya , karena berbagai bug dalam implementasi (seperti yang dari IE).
Semoga semuanya masuk akal :)
[Pembaruan 2010/12/16]
Dalam ES5 (ECMAScript 5; baru-baru ini distandarisasi, edisi ke-5 bahasa) ada yang disebut "mode ketat" - mode bahasa opt-in, yang sedikit mengubah perilaku tugas yang tidak diumumkan. Dalam mode ketat, penugasan ke pengidentifikasi yang tidak diumumkan adalah ReferenceError . Alasan untuk ini adalah untuk menangkap tugas yang tidak disengaja, mencegah penciptaan properti global yang tidak diinginkan. Beberapa browser yang lebih baru sudah mulai menggulirkan dukungan untuk mode ketat. Lihat, misalnya, tabel compat saya .