概要
javascriptでグローバル変数を宣言する時、変数の定義がどのように振舞うのかを調べます。
グローバル変数を生成する際は、グローバルオブジェクトのプロパティが定義されます。
strictモード(‘use strict’)を使わない場合、宣言していない変数に値を代入した瞬間にグローバル変数が作られます。
宣言していない変数とは、具体的には次のような例になります。
//varを使わず、いきなり100を代入(グローバル変数) test = 100;
上記のように、varによる変数宣言をしない場合は、再定義が可能なプロパティとして生成されます。
また、逆の意味でvarによる変数宣言をする場合は、再定義が不可能なプロパティとして生成されます。
サンプルコード
試しに以下のコードを書きます。
グローバル変数を宣言して生成する場合と、宣言なしで生成する場合の動きの違いがわかります。
//varを使ったグローバル変数へ代入 var test = 10; console.log(test); //varを使わず、グローバル変数へ代入 test2 = 20; console.log(test2); delete test; console.log(test); delete test2; console.log(test2);
再定義が可能かどうかを調べる為に、delete演算子を使って、それぞれの変数の削除を試みています。
実際に実行した結果は次のようになります。
10 20 10 ReferenceError: test2 is not defined
最後のtest2という変数はdelete演算子によって削除はできません。
これはvar宣言しない場合の変数宣言は再定義可能な(グローバルオブジェクトの)プロパティとして生成されるので、削除ができたということになります。
削除ができた為に、コンソールで出力しようとしたところ、「ReferenceError: test2 is not defined」というエラーになります。
変数宣言についてのまとめ
簡単にまとめると
■var宣言したグローバル変数
再定義不可
■var宣言しないグローバル変数
再定義可能
(delete演算子による削除ができた)
ということになります。
Callオブジェクトについて
Callオブジェクトという概念についてまとめます。
javascriptではグローバル変数はグローバルオブジェクトのプロパティとして解釈されます。
では、ローカル変数の場合はどうなるかと言いますと、関数の呼び出した時に変数オブジェクトが生成されます。
上記の関数を呼び出した時に生成される変数オブジェクトのことをCallオブジェクトと呼びます。
Callオブジェクトは次の情報が含まれています。
関数内のローカル変数の値
関数に渡された引数(名前と値)
引数情報を管理するオブジェクト
thisキーワード
このCallオブジェクトの考え方はスコープチェーンを理解する時に重要になります。