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";