JavaScript で変数を宣言する場合、var キーワードを付けても付けなくても実行に問題はありませんが、2 つの方法には依然として違いがあります。コードが機能するからといって、それが良いコードであるとは限りません。
var num = 1;
そして num = 1;
実際には、これは属性の割り当て操作です。まず、現在のスコープ チェーンで num を解決しようとします (メソッドで宣言されている場合、現在のスコープ チェーンはグローバル スコープとメソッドのローカル スコープなどを表します)。 num が現在のスコープ チェーンで見つかった場合は、 num 属性が実行されます。num が見つからない場合は、グローバル オブジェクト (つまり、ウィンドウ オブジェクトなど、現在のスコープ チェーンの最上位オブジェクト) に num 属性が作成され、値が割り当てられます。
注意!グローバル変数は宣言しませんが、グローバル オブジェクトのプロパティを作成します。
そうは言っても、ここでの「変数の宣言」と「オブジェクトのプロパティの作成」の違いを理解するのはまだ難しいかもしれません。実際、JavaScript の変数宣言、属性の作成、各 Javascript の各属性には、読み取り専用 (ReadOnly)、列挙不可能 (DontEnum)、削除不可能 (DontDelete) など、属性を説明するための特定の記号があります。待って。
変数宣言に削除不可属性があるため、var num = 1とnum = 1を比較します。前者は削除不可属性を持つ変数宣言であるため、後者は削除できません。グローバル変数なので、グローバル変数から削除できます。
詳細については、次のコードを参照してください:
num2 = 2;
//削除できません
// num2 を削除します。
関数モデル(){var num1 = 1; // ローカル変数
num2 = 2; // ウィンドウの属性
// 匿名関数
(function(){
var num = 1; // ローカル変数
num1 = 2;
num3 = 3; // ウィンドウの属性}
}
追記: ECMAScript5 標準には、「厳密モード」があります。厳密モードでは、宣言されていない識別子に値を割り当てると参照エラーがスローされるため、グローバル変数属性が誤って作成されることが防止されます。現在、一部のブラウザの新しいバージョンではすでにサポートされています。