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