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 を使用します。




