【JavaScript】var vs let vs const
JavaScriptの変数宣言にはvarが使われていたが、ECMAScript2015(ES6)からconstとletが追加された。 リファレンス
それぞれの違い
var
関数スコープ
関数内のどこで宣言しても、その関数を実行する前に宣言処理がされる
MDNのドキュメントにもあるようにvarには巻き上げ(hoisting)と呼ばれる現象がある
let / constが利用可能な環境では基本的に使用しない(必要になるケースがまず無い)
let
ブロックスコープ
従来の varは基本的に全てletに置き換えられる
constと異なり、変数の再代入が可能
const
ブロックスコープ
再代入不可
どれを使うべきか?
基本的にconst、再代入が必要な場合のみletを使用する
constはあくまでも再代入が不可なだけで、オブジェクトや配列の操作はできる
C/C++のconstに慣れていると違和感しか無いが慣れよう
実際にコーディングしていると意外とletを使う機会は少ない
1000行程度のコードでもletは1度も使わないこともしばしば
forループ用の変数にletを使うが、forEachを使ってforを使わないことも多い
var?
要らない子
巻き上げ(hoisting)
「varに限らずletもconstも巻き上げは発生する」という記述を時々みかける。
これは「巻き上げ」の定義の違いだと思う。
1.宣言箇所にかかわらず変数宣言をブロックの先頭で行う
2.(1により宣言が先頭で行われているため)同一ブロック内であれば宣言箇所より手前で参照可能である
1に関してはvar、let、const全てで発生するが、2はvarでのみ発生する。
1はJavaScriptエンジンが勝手にやってればいい話であって、コーディングする人には関係ない。
コーディング時に問題になるのは2であって、1ではない。
MDNでは1の挙動を引き上げ、2の挙動を巻き上げと呼んでいる模様。