83692


_**状況**_  
google chromeのデベロッパーツール内のコンソール機能で簡単なコードを打ち込んで変数のスコープについて調べていました。  
その中で1つだけ理由が分からない結果があったので理屈が知りたいので質問します。

_**コード**_

[code]

     {
      // 親で宣言した変数
      var a = 10
      function hoge() {
          // 今のaの状態を表示。親で初期化されてるため10が表示される
         console.log('hoge', a)
         // 親の値を書き換える
        var  a = 20
      }
      hoge()
      // ここはhogeで書きかわっているので、20が表示される
      console.log('fuga', a)
    }
[/code]

↑↑このhoge関数内の `var a=20` の`var`が無ければ`hoge
10`と表示されるのですが,なぜか`var`をつけると`undefined`になってしまいます。  
スコープやクロージャの概念があまり理解できていないので初歩的な質問をしてしまいたしたが、回答していただけると嬉しいです。


CC BY-SA 4.0
2021-11-18T05:08:26.067
83689
2021-11-18T05:47:48.683
49132
question
javascript
jsの変数の中身について


JavaScriptで最も奇妙な仕様ですね。 **`var` で宣言された変数のスコープは、宣言した場所に関わらず関数全体**になります。

質問文のコードは、以下と同じ挙動になります。

[code]

    function hoge() {
      var a;
      console.log('hoge', a); // ローカルの a を参照
      a = 20;
    }
    
[/code]


CC BY-SA 4.0
2021-11-18T05:47:48.683
83692
2021-11-18T05:47:48.683
3475
83689
answer