let変数の宣言
宣言されずに変数が使用されると、is not defined というエラーが報告されます。
変数が初期値undefinedで宣言され、値が代入されずに使用される場合、変数の値は:undefinedです。
var との違い
var 変数昇格を持つ ブロックレベルのスコープを持たない 繰り返し宣言可能 汚染するグローバル変数
let は変数の昇格を持ちません ブロックレベルのスコープを持ちます 繰り返し宣言できません グローバル変数を汚染しません
1.変数のリフティングはなく、ブロックレベルのスコープがあります。
 console.log(a); //undefined
 console.log(b); //エラー b が定義されていない 
 if (1 === 1) {
 var a = 1;
 let b = 10; //b {} 
 }
 console.log(b);//エラー b が定義されていない
上記のコードを一緒に実行すると、次のように表示される。
2.宣言の繰り返し
 		var a = 1;
 var a = 2;
 console.log(a); //2 後の宣言が前の宣言を上書きする。
 let b = 1;
 let b = 2;
 console.log(b); //エラー 識別子'b'はすでに宣言されている 
上記のコードが一緒に実行された場合、プログラムはエラーを報告し、aは出力されないが、一般的にvarとletは混在しない。
3.汚染されていないグローバル変数
		// let RegExp = 10;
 // console.log(RegExp); //10
 // console.log(window.RegExp); //ƒ RegExp() { [native code] }
 var RegExp = 10;
 console.log(RegExp); //10
 console.log(window.RegExp); //10
const定数の宣言
1.定数の宣言 一度宣言した定数は変更できない リテラルは変更できないが、オブジェクト内部の内容は変更可能。
letと同様、変数の昇格はありません。 ブロックレベルのスコープで、複数回宣言することはできません。 グローバル変数を汚染することもありません。
		const max = 20;
 // max = 30; //Assignment to constant variable. リテラルは変更できない
 const person = {
 name: "tanakasan"
 }
 person.name = "lisi"; 
 console.log(person); //{name: "lisi"} ただし、オブジェクトの中身を変更することは可能である。
letfor ループの応用
		var arr = []; 
 for (var i = 0; i < 10; i++) {
 arr[i] = function() {
 return i; //
 }
 } 
 console.log(arr); 
		console.log(arr[5]()); //10
//	ループの最後に、arrに10個の関数が格納されている。=10
// 関数の中身を見るには関数をプリントする:
// [[Scopes]]: Scopes[1]
// 0: Global {parent: Window, opener: null, top: Window, length: 0, frames: Window,  }
// グローバルスコープでのi=10
 const arr1 = []; //変数のリフティングはなく、ループするたびにブロックレベルのスコープが作成され、それぞれに個別の変数iが入り、最終的に関数が実行される。
 for (let i = 0; i < 10; i++) {
 arr1[i] = function() {
 return i;
 }
 }
 	console.log(arr1); 
		console.log(arr1[5]()); //5
//各関数には、ブロックレベルのスコープとグローバルスコープがある。=10,ブロック・レベル・スコープのiは、ループ本体と一緒に変化する。関数が実行されると、まずブロックレベル・スコープに値を取りに行く。
// 関数の中身を見るには関数をプリントする:
// [[Scopes]]: Scopes[2]
// 0: Block {i: 0}
// 1: Global {parent: Window, opener: null, top: Window, length: 0, frames: Window,  
 
letlet と const の使い分け
デフォルトでは const を使用し、変数の値を変更する必要がある場合は let を使用します。




