JavaScript Let
let キーワードは ES6(2015年)で導入されました。
let で宣言された変数はブロックスコープを持ちます。
let で宣言された変数は使用する前に宣言されなければなりません。
let で宣言された変数は同じスコープ内で再宣言することはできません。
ブロックスコープ
ES6(2015年)以前、JavaScriptにはブロックスコープがありませんでした。
JavaScriptにはグローバルスコープと関数スコープがありました。
ES6では、let と const という2つの新しいキーワードが導入され、JavaScriptにブロックスコープを提供しました:
{
let x = 2;
}
// ここでは x を使用できません
グローバルスコープ
var で宣言された変数は常にグローバルスコープを持ちます。
var キーワードで宣言された変数はブロックスコープを持つことができません:
{
var x = 2;
}
// ここでは x を使用できます
再宣言できない
let で定義された変数は再宣言できません。
let で宣言された変数を再宣言することはありません。
let を使用すると、次のようにできません:
let x = "John Doe";
let x = 0;
var で定義された変数は再宣言できます。
var を使用すると、次のようにできます:
var x = "John Doe";
var x = 0;
変数の再宣言
var キーワードを使用して変数を再宣言すると問題が発生することがあります。
ブロック内で変数を再宣言すると、ブロック外の変数も再宣言されます:
var x = 10;
// ここでは x は 10 です
{
var x = 2;
// ここでは x は 2 です
}
// ここでは x は 2 です
let キーワードを使用して変数を再宣言すると、この問題を解決できます。
ブロック内で変数を再宣言しても、ブロック外の変数は再宣言されません:
let x = 10;
// ここでは x は 10 です
{
let x = 2;
// ここでは x は 2 です
}
// ここでは x は 10 です
var、let、constの違い
スコープ | 再宣言 | 再代入 | 巻き上げ | thisにバインド |
---|---|---|---|---|
var | No | Yes | Yes | Yes |
let | Yes | No | Yes | No |
const | Yes | No | No | No |
重要
let と const はブロックスコープを持ちます。
let と const は再宣言できません。
let と const は使用する前に宣言しなければなりません。
let と const は this にバインドしません。
let と const は巻き上げされません。
良い点
let と const はブロックスコープを持ちます。
let と const は再宣言できません。
let と const は使用する前に宣言しなければなりません。
let と const は this にバインドしません。
let と const は巻き上げされません。
注意
Internet Explorer 11以前では let と const キーワードはサポートされていません。
最初の完全なサポートが始まったブラウザのバージョンに関する情報は以下の表をご参照ください:
Chrome 49 | Edge 12 | Firefox 36 | Safari 11 | Opera 36 |
---|---|---|---|---|
2016年3月 | 2015年7月 | 2015年1月 | 2017年9月 | 2016年3月 |
再宣言
var を使用して JavaScript 変数を再宣言することはプログラムのどこでも許可されています:
var x = 2;
// ここで x は 2 です
var x = 3;
// ここで x は 3 です
let を使用すると、同じブロック内での変数の再宣言は許可されません:
var x = 2; // 許可されています
let x = 3; // 許可されていません
{
let x = 2; // 許可されています
let x = 3; // 許可されていません
}
{
let x = 2; // 許可されています
var x = 3; // 許可されていません
}
Let の巻き上げ
var で定義された変数は先頭に巻き上げられ、いつでも初期化できます。
これはOKです:
carName = "Volvo";
var carName;
let で定義された変数もブロックの先頭に巻き上げられますが、初期化されません。
つまり、let 変数を宣言する前に使用すると ReferenceError が発生します:
carName = "Saab";
let carName = "Volvo";