There's a difference.
var x = 1
declares variable x
in current scope (aka execution context). If declaration appears in a function - local variable is declared; if it's in global scope - global variable is declared.
x = 1
, on the other hand, is merely a property assignment. It first tries to resolve x
against scope chain. If it finds it anywhere in that scope chain, it performs assignment; if it doesn't find x
, only then it creates x
property on a global object (which is a top level object in a scope chain).
Now, notice that it doesn't declare global variable, it creates a global property.
The difference between two is subtle and might be confusing unless you understand that variable declarations also create properties (only on a Variable Object) and that every property in Javascript (well, ECMAScript) have certain flags that describe their properties - ReadOnly, DontEnum and DontDelete.
Since variable declaration creates property with DontDelete flag, the difference between var x = 1
and x = 1
(when executed in global scope) is that former one - variable declaration - creates DontDelete'able property, and latter one doesn't. As a consequence, property created via this implicit assignment can then be deleted from the global object, and former one - the one created via variable declaration - can not be.
But this is jut theory of course, and in practice there are even more differences between two, due to various bugs in implementations (such as that from IE).
Hope it all makes sense : )