ES6の登場により、varは変数を定義する唯一の方法ではなくなりました。
I. 最初にvarで変数を定義すると、このようなバグがあります:
1.jsにはブロックレベルのスコープがありません。変数はjs関数内でvarで定義され、そのスコープは関数本体全体です。
for (var i = 0; i < 10; i++) { var a = 1;}console.log(a)
forループの内部で定義された変数は、forループの外部でも使用できます。
2.ループ内での変数の過剰共有
for (var i = 0; i < 3; i++) { setTimeout(function () { console.log(i) }, 1000)}
上記のforループ、出力はどうなると思いますか?出力はthree 3です。ループ自身と3つのタイムアウトコールバックはすべて一意な変数iを共有しています。
II.let、素晴らしい!
1.**letを使って宣言された変数はブロックレベルのスコープを持ちます。**letを使用して宣言された変数は、外側の関数全体ではなく、外側のブロックにスコープされます。let宣言はまだリフティング機能を保持していますが、やみくもにリフティングされることはありません。
2.** let で宣言されたグローバル変数は、グローバルオブジェクトのプロパティではありません。**let で定義された変数は、window.変数名ではアクセスできません。
3.** for(let i...)のようなループのようなループでは、繰り返しのたびに i に対する新しいバインディングが作成されます。** var の 2 番目の例のように、ループが複数回実行され、ループがすべてクロージャを維持する場合、var で定義された変数の場合のように、すべてのクロージャがループ変数に同じ値を取得するのではなく、それぞれのクロージャがループ変数に異なる値を取得します。
III.cosnt、定数の宣言!
ES6では、const宣言は参照を指すという点で、ポインタに似ています:
{ const ARR = [5, 6]; //var ARR = [5,6] ARR.push(7); console.log(ARR); // [5,6,7] ARR = 10; // TypeError varで変数を定義すれば、ARRに値を代入することができる。.log(ARR)}
constで定義された配列は、配列にデータを追加する操作はできますが、変数に値を再代入することはできません。constは値を代入せずに宣言することはできず、constを使用する場合は大文字の変数を使用してください!