JavaScript には確かに慣れるのに少し時間がかかる概念がいくつかあります。簡単な質問のように思えることに対する答えが長くなってしまうこともありますが、できるだけ迅速かつ簡潔にしようと思います。
JavaScript では、変数は関数によってスコープされ、変数をスコープできる (コンテキストを持つ) 場所は、「グローバル」または「ローカル」の 2 つです。Web ブラウザーのグローバル コンテキストは「ウィンドウ」であるため、コード例var x = 5;
ではグローバル変数です。コード内のローカル コンテキストはチェック関数内にあるためvar x = 4;
、チェック関数のローカル変数です。さらに関数がある場合、それらには独自の関数スコープ(コンテキスト)などがあります。関数内で変数を宣言するときに「var」という単語を忘れると、「グローバル」変数になるので注意してください。「グローバル」と「ローカル」のスコープができたので、Javascript プログラムが実行される前に何が起こるのでしょうか?
コードが実行される前に Javascript エンジンでいくつかのことが起こりますが、変数に何が起こるかだけを見ていきます。変数は、その機能コンテキストまたはスコープの一番上に「引き上げられる」と言われます。つまり、変数宣言が「持ち上げられるか、一番上に移動され、値「未定義」が割り当てられますが、初期化されず、初期化は元の場所にとどまります」ということです。この巻き上げにより、定義された関数内のどこでも変数を使用できるようになります。
したがって、次のようになります。
//to be accurate this is hoisted to its functional scope as well
var x;
x = 5;
function check() {
//declaration of 'x' hoisted to the top of functional scope,
//and assigned undefined
var x;
//this will alert undefined
alert(x);
//initialization of variable remains here
x = 4;
//so after the initialization of 'x' this will alert 4
alert(x);
}
check();
ハッピーコーディング!!!
余談ですが、ブロック レベルのスコープを追加するために実装できる「let」という名前の新機能があります。EMCAScript 6 には実装されていると思いますが、現時点ではすべてのブラウザに実装されているわけではないため、脇に置きました。