## const, let, varの流れで書いた場合

- 変数と宣言 {#variable-and-declaration}
    - `const`, `let`, `var`の順番で紹介する
    - `var`は最も古くからある変数宣言の構文です。しかし、`var`にはさまざまな問題があることが知られています。
    - `const`と`let`は`var`の問題を改善するためにECMAScript 2015で導入された変数宣言を行うためのキーワードです。
    - ここではよく使うであろう`const`、`let`、`var`の順に、それぞれの変数宣言で宣言した変数の違いについて見ていきます。
- `const`
    - `const`キーワードを使うことで、次のように変数の宣言と同時に初期値を定義できます
    - これはaという変数を定義し、bという値を代入しています
    - 一度に、複数の変数宣言をカンマ区切りで行えます。
    - これは次のように書いたのと同じ意味となります。
    - constは再代入できない変数を定義するキーワードです。
    - そのため、`const`キーワードで宣言した変数に対して、後から再代入することはできません。
    - 例) 
    - `const`キーワードでは同じ変数名の変数を2つ定義しようとすると構文エラーとなります。
    - 次のように間違えて同じ変数を再定義してしまうとエラーとなります。
- `let`
    - `let`キーワードも`const`キーワードと同様に変数宣言と初期値の代入ができます。
    - `const`キーワードとは異なり初期値がない変数を定義できます。
    - 初期値がない場合は、デフォルト値として`undefiend`という値で初期化されます(`undefined`は値が未定義ということを表す値です)
    - また、`let`キーワードでは、変数宣言後に値を再代入することができます。
    - 次のように同じ変数に対して、値を再代入しましょう。
    - 一般的に、同じ変数で異なる意味の値を参照するのはバグのもとなるため、
    - そのような場合は`const`キーワードを使いましょう。
    - 一方で一時的なことを意味する値で、同じ変数名を使ったほうが処理が簡潔な場合は`let`で変数を宣言します。
    - これはfor文などを使った反復処理での一時的な変数には`let`を使うことがあるので、詳しくはループと反復処理で解説します
- `var`
    - `var`も`const`や`let`と同様に変数の宣言と同時に値の初期化ができます。
    -　また、`let`と同じように初期値が無い変数を宣言でき、変数に対して値を再代入も可能です。
    - `var`は`let`キーワードとよく似ていますが、`var`キーワードはつぎのようなバグを発生箚せやすい問題をもっています。
        - 同じ変数名を宣言できてしまうこと
        - 例)
        - また`var`には変数の巻き上げと呼ばれると意図しない挙動があります。
        - 巻き上げについては、スコープという機能が関係します。スコープについては「関数とスコープ」の章で扱うため、現時点では「letはよりよいvar」ということだけ覚えておくとよいです。
- 変数名に使える名前のルール {#variable-name}
    - ここまででconst,let,varでの変数宣言とそれぞれの特徴について見てきましたが、どの宣言方法でも宣言できる変数名のルールは同じとなります。
    - これは変数に限らず、関数名などJavaScriptにおける名前において大部分で共通するルールとなります。
    - ~ 変数名のルール ~ 
- [未使用] 命名規則
    - JavaScriptには特別な命名規則が意味を持つケースはない
    - キャメルケールがよく使われている
    - 定数っぽいものは大文字と_のみで書くといったケースもよく見る
- まとめ {#variales-summary}
    - `const`は、再代入できない変数を宣言できる。
    - `let`は、再代入ができる変数の宣言できる。
    - `var`は、再代入ができる変数を宣言できるが、いくつかの問題が知られている
    - 変数名に利用できる名前はどれも共通
    - varは殆どのケースでletやconstに置き換えが可能です。 constは再代入できない変数を定義するキーワードです。 再代入を禁止することで、ミスから発生するバグを減らすことが期待できます。
    - そのためconstで変数を定義できないかを検討し、できない場合はletを使うことを推奨しています。
