違いがあります。
var x = 1
x
現在のスコープ(別名実行コンテキスト)で変数を宣言します。宣言が関数に現れる場合-ローカル変数が宣言されます。グローバルスコープ内にある場合-グローバル変数が宣言されます。
x = 1
一方、は単なるプロパティの割り当てです。まずx
、スコープチェーンに対して解決を試みます。そのスコープチェーンのどこかにそれが見つかると、割り当てを実行します。が見つからない場合にx
のみ、グローバルオブジェクト(スコープチェーンの最上位オブジェクト)にプロパティを作成しx
ます。
ここで、グローバル変数を宣言しておらず、グローバルプロパティを作成しています。
2つの違いは微妙であり、変数の宣言でもプロパティが作成され(変数オブジェクトのみ)、Javascriptのすべてのプロパティ(ECMAScript)に、そのプロパティを説明する特定のフラグ(ReadOnly、DontEnum、およびDontDelete。
変数宣言はDontDeleteフラグを使用してプロパティを作成するため、var x = 1
andとx = 1
(グローバルスコープで実行した場合)の違いは、前者(変数宣言)がDontDelete可能なプロパティを作成し、後者は作成しないことです。結果として、この暗黙の割り当てによって作成されたプロパティはグローバルオブジェクトから削除でき、前のプロパティ(変数宣言によって作成されたプロパティ)は削除できません。
しかし、これはもちろん理論に過ぎず、実際には、実装のさまざまなバグ(IEのバグなど)のため、2つのにはさらに大きな違いがあります。
それがすべて理にかなっていることを願っています:)
[更新2010/12/16]
ES5(ECMAScript 5、最近標準化された第5版の言語)には、いわゆる「厳密モード」、つまり宣言されていない割り当ての動作をわずかに変更するオプトイン言語モードがあります。厳密モードでは、宣言されていない識別子への割り当てはReferenceErrorです。これの理由は、偶発的な割り当てをキャッチして、不要なグローバルプロパティの作成を防ぐことでした。新しいブラウザのいくつかは、ストリクトモードのサポートのローリングをすでに開始しています。たとえば、私の互換表を参照してください。