[JavaScript] var vs. let vs. const


varletconst scope関数ブロックシースOOO宣言前にORefference ErrorReferenceedError宣言を使用するとともに値割り当て選択に必要な値を選択してOOXを再割り当てOXXを再宣言する

var


スキャン


関数レベルスキャン.

がんばって


varは反発し、宣言文を割り当て文から分離し、宣言文の動作はスキャンの最上位に昇格したようにします.また、宣言と同時にUndefinedに初期化され、付与文に遭遇した場合は変数に付与されます.したがって、変数宣言の前に参照しても、エラーは発生せず、未定義のものを出力します.
console.log(x); // undefined
var x = 1; // 1

わりあて


宣言と同時に値を割り当てるか、先に宣言してから値を割り当てることができます.開発者は1つの文で作成しますが、JavaScriptエンジンでは宣言文と付与文が別々になります.したがって、宣言はエスケープされて未定義に初期化されます.また、再割り当てにより値を変更したり、再宣言したりすることができます.
var x; // undefined
x = 1; // 1

x = 2; // 2
var x = 3; // 3

let


スキャン


ブロックレベルスキャンです.

がんばって


ES 6はすべての宣言をサポートするため、letとconstもサポートします.しかし、動作は合わないようだ.これは、値を割り当てる前に参照できないためです.次の例を示します.
let x = 0; // 0 // global
{
  console.log(x); // RefferenceError
	let x = 1; // 1 // local
}
反発がない場合、ブロック内でxを参照する場合、領域変数xはまだ宣言されていないため、グローバル変数xを参照する必要があります.ただし、エラーが出力されます.これは、領域変数xの宣言がscopeの最上位レベルでhoistingによって実現されることを示している.この部分までは既存のvarと同じです.しかしletとconstはここから違いがあります.
宣言はscopeの最上位レベルで行われますが、varとは異なりundefinedに初期化されず、宣言されたコードでのみundefinedまたは割り当て値に初期化されます.すなわち,スコフの上端から宣言まで初期化されていないため参照できない.この部分を一時死角区と呼ぶ.

わりあて


宣言と初期化は必ずしも一緒にする必要はありません.また、再配分も可能です.しかし、再び発表することはできない.

const


スキャン


ブロックレベルスキャンです.

がんばって


letの動作と同様にTDZが存在する.

わりあて


宣言と初期化を一緒にしなければならない.contは変数とは逆の概念である定数であり,いったん割り当てられると再割り当てできない.また、可変の元のデータは値を変更できません.ただし、可変配列またはオブジェクトを割り当てることで値を変更できます.再割り当ては不可能ですが、データ自体を変更できます.再配分と勘違いしないように注意しましょう.

var / let / const


  • ES 6を使用する場合、varは使用しないほうがいいです.
    エラーとメモリ漏洩のリスク

  • デフォルトではconstが使用され、letは再割り当てが必要な場合にのみ使用されます.