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