JavaScript のスコープを理解する - tacamy.blog http://tacamy.hatenablog.com/entry/2012/12/30/191125

JavaScriptにはグローバル変数とローカル変数がある.

JavaScriptのローカル変数のスコープ(ある変数が有効な範囲)は関数スコープとなる.

C言語などと違い,制御文(ifやforなど)の中括弧ブロック{}の中で宣言された変数は,中括弧ブロックの外からも参照できる.

function sayHello(){
	if(1){
		var hello = "hello!";
	}
	console.log(hello);
}
sayHello(); // => hello!!

グローバル変数とローカル変数で同名の変数があると,ローカル変数が参照される.

var hello = "global_hello";
function sayHello(){
	var hello = "local_hello";
	console.log(hello);
}
sayHello(); // => local_hello

では,以下のようなコードでは何が出力されるだろう?

var hello = "global_hello";
function sayHello(){
	console.log(hello);
	var hello = "local_hello";
}
sayHello();

直感的には,console.log()でhelloを参照する時,sayhello関数のローカル変数helloはまだ宣言されていないので,グローバル変数helloの値"global_hello"が出力されるのではと思える.

実際には,undefinedが出力される.

JavaScriptでは関数内で宣言された変数は関数全体で有効となる.

しかし,初期化処理自体はその文が実行されるまで有効とならない.

これを巻き上げ(ホイスティング)と呼ぶらしい.

Google日本語入力が"ほいすてぃんぐ"を変換すると誤字だと認識して"ホスティング"と変換しようとするので厄介.