JavaScript let と const

ECMAScript 2015(ECMAScript 6)

ES2015 (ES6) では、重要な JavaScript キーワードが 2 つ追加されました:letとconst。

let で宣言された変数は、let コマンドがあるコードブロック内でのみ有効です。

const は読み取り専用の定数を宣言し、一度宣言すると定数の値は変更できません。

ES6 以前は、JavaScript にはスコープが 2 つしかありませんでした:グローバル変数と関数内のローカル変数。


グローバル変数

関数の外で宣言された変数のスコープはグローバルです:

例

var carName = "Volvo"; //ここでは carName 変数を使用できます function myFunction() { //ここでも carName 変数を使用できます }

試してみる »

グローバル変数は、JavaScript プログラムのどこからでもアクセスできます。


ローカル変数

関数内で宣言された変数のスコープはローカル(関数内)です:

例

//ここでは carName 変数を使用できません function myFunction() { var carName = "Volvo"; //ここでは carName 変数を使用できます } //ここでは carName 変数を使用できません

試してみる »

関数内で var を使用して宣言された変数は関数内でのみアクセスできます。var を使用しない場合はグローバル変数になります。


JavaScript ブロックスコープ (Block Scope)

var キーワードで宣言された変数はブロックスコープの特性を持たず、{} の外でもアクセスできます。

{ 
    var x = 2; 
}
// 这里可以使用 x 变量

ES6 以前には、ブロックスコープの概念はありませんでした。

ES6 では let キーワードを使用してブロックスコープを実現できます。

let で宣言された変数は、let コマンドがあるコードブロック{}内でのみ有効で、{}その外ではアクセスできません。

{ 
    let x = 2;
}
// 这里不能使用 x 变量

変数の再定義

var キーワードを使用して変数を再宣言すると、問題が発生する可能性があります。

ブロック内で変数を再宣言すると、ブロック外の変数も再宣言されます:

例

var x = 10; //ここでは x は 10 と出力されます { var x = 2; //ここでは x は 2 と出力されます } //ここでは x は 2 と出力されます

試してみる »

let キーワードはこの問題を解決できます。let コマンドがあるコードブロック{}内でのみ有効です。

例

var x = 10; //ここでは x は 10 と出力されます { let x = 2; //ここでは x は 2 と出力されます } //ここでは x は 10 と出力されます

試してみる »

ブラウザのサポート

Internet Explorer 11 およびそれ以前のバージョンのブラウザは let キーワードをサポートしていません。

次の表は、各ブラウザが let キーワードをサポートする最低バージョン番号を示しています。

Chrome 49 IE / Edge 12 Firefox 44 Safari 11 Opera 36
Mar, 2016 Jul, 2015 Jan, 2015 Sep, 2017 Mar, 2016

ループスコープ

var キーワードを使用:

例

var i = 5; for (var i = 0; i < 10; i++) { //何らかのコード... } //ここでは i は 10 と出力されます

試してみる »

let キーワードを使用:

例

var i = 5; for (let i = 0; i < 10; i++) { //何らかのコード... } //ここでは i は 5 と出力されます

試してみる »

最初の例では、varキーワードを使用しました。そのキーワードで宣言された変数は、ループ内とループ外を含めてグローバルです。

2 番目の例では、letキーワードを使用します。そのキーワードで宣言された変数のスコープはループ内のみで、ループ外の変数は影響を受けません。


ローカル変数

関数内でvarとletキーワードを使用して宣言された変数も同様です。

それらのスコープはどちらもローカルです:

// 使用 var
function myFunction() {
    var carName = "Volvo";   // 局部作用域
}

// 使用 let
function myFunction() {
    let carName = "Volvo";   //  局部作用域
}

グローバル変数

関数外またはコードブロック外でvarとletキーワードを使用して宣言された変数も同様です。

それらのスコープはどちらもグローバルです:

// 使用 var
var x = 2;       // 全局作用域

// 使用 let
let x = 2;       // 全局作用域

HTML コード内でのグローバル変数の使用

JavaScript では、グローバルスコープは JavaScript 環境に関するものです。

HTML では、グローバルスコープは window オブジェクトに関するものです。

使用varキーワードで宣言されたグローバルスコープの変数は window オブジェクトに属します:

例

var carName = "Volvo"; //window.carName を使用して変数にアクセスできます

試してみる »

使用letキーワードで宣言されたグローバルスコープの変数は window オブジェクトに属しません:

例

let carName = "Volvo"; //window.carName を使用して変数にアクセスすることはできません

試してみる »

変数の再代入

使用varキーワードで宣言された変数はどこでも変更できます:

例

var x = 2; //x は 2 var x = 3; //今 x は 3

試してみる »

同じスコープまたはブロックスコープ内では、letキーワードを使用してvarキーワードで宣言された変数を再代入できません:

var x = 2;       // 合法
let x = 3;       // 不合法

{
    var x = 4;   // 合法
    let x = 5   // 不合法
}

同じスコープまたはブロックスコープ内では、letキーワードを使用してletキーワードで宣言された変数を再代入できません:

let x = 2;       // 合法
let x = 3;       // 不合法

{
    let x = 4;   // 合法
    let x = 5;   // 不合法
}

同じスコープまたはブロックスコープ内では、varキーワードを使用してletキーワードで宣言された変数を再代入できません:

let x = 2;       // 合法
var x = 3;       // 不合法

{
    let x = 4;   // 合法
    var x = 5;   // 不合法
}

letキーワードは、異なるスコープまたは異なるブロックスコープでは再宣言して代入することができます:

let x = 2;       // 合法

{
    let x = 3;   // 合法
}

{
    let x = 4;   // 合法
}

変数の巻き上げ

JavaScript では、var キーワードで定義された変数は使用後に宣言できます。つまり、変数は先に使用してから宣言できます(JavaScript の変数の巻き上げ)。

例

//ここでは carName 変数を使用できます var carName;

試してみる »

let キーワードで定義された変数は使用後に宣言することはできません。つまり、変数は先に宣言してから使用する必要があります。

// 在这里不可以使用 carName 变量

let carName;

const キーワード

const は 1 つ以上の定数を宣言するために使用します。宣言時には初期化が必要で、初期化後は値を変更できません:

例

const PI = 3.141592653589793; PI = 3.14; //エラー PI = PI + 10; //エラー

試してみる »

const定数の定義は、let を使用してlet定義された変数と似ています:

  • 両方ともブロックスコープです
  • どちらも、そのスコープ内の他の変数や関数と同じ名前を持つことはできません

さらに、次の 2 つの違いがあります:

  • constで宣言された定数は初期化する必要がありますが、letで宣言された変数は初期化する必要がありません。
  • const で定義された定数の値は、再代入によって変更できず、再宣言もできません。一方、let で定義された変数の値は変更できます。
var x = 10;
// 这里输出 x 为 10
{ 
    const x = 2;
    // 这里输出 x 为 2
}
// 这里输出 x 为 10

const で宣言された定数は初期化する必要があります:

// 错误写法
const PI;
PI = 3.14159265359;

// 正确写法
const PI = 3.14159265359;

実際には本当の定数ではない

const の本質: const で定義された変数は定数ではなく、不変でもありません。値への定数参照を定義します。const で定義されたオブジェクトや配列は、実際には変更可能です。次のコードはエラーになりません:

例

//定数オブジェクトを作成 const car = {type:"Fiat", model:"500", color:"white"}; //プロパティを変更: car.color = "red"; //プロパティを追加 car.owner = "Johnson";

試してみる »

しかし、定数オブジェクトに再代入することはできません:

例

const car = {type:"Fiat", model:"500", color:"white"}; car = {type:"Volvo", model:"EX60", color:"red"}; //エラー

試してみる »

次の例では、定数配列を変更します:

例

//定数配列を作成 const cars = ["Saab", "Volvo", "BMW"]; //要素を変更 cars[0] = "Toyota"; //要素を追加 cars.push("Audi");

試してみる »

しかし、定数配列に再代入することはできません:

例

const cars = ["Saab", "Volvo", "BMW"]; cars = ["Toyota", "Volvo", "Audi"]; //エラー

試してみる »

ブラウザのサポート

Internet Explorer 10 およびそれ以前のバージョンのブラウザは、const キーワードをサポートしていません。

次の表は、各ブラウザが const キーワードをサポートする最低バージョン番号を示しています。

Chrome 49 IE / Edge 11 Firefox 36 Safari 10 Opera 36
Mar, 2016 Oct, 2013 Feb, 2015 Sep, 2016 Mar, 2016

変数の再代入

使用varキーワードで宣言された変数はどこでも変更できます:

例

var x = 2; //有効 var x = 3; //有効 x = 4; //有効

同じスコープまたはブロックスコープ内では、constキーワードを使用して再宣言することはできません:varとletキーワードで宣言された変数:

var x = 2;         // 合法
const x = 2;       // 不合法
{
    let x = 2;     // 合法
    const x = 2;   // 不合法
}

同じスコープまたはブロックスコープ内では、constキーワードを使用して再宣言することはできません:constキーワードで宣言された変数:

const x = 2;       // 合法
const x = 3;       // 不合法
x = 3;             // 不合法
var x = 3;         // 不合法
let x = 3;         // 不合法

{
    const x = 2;   // 合法
    const x = 3;   // 不合法
    x = 3;         // 不合法
    var x = 3;     // 不合法
    let x = 3;     // 不合法
}

constキーワードは異なるスコープ、または異なるブロックスコープ内では再宣言および再代入できます:

const x = 2;       // 合法

{
    const x = 3;   // 合法
}

{
    const x = 4;   // 合法
}

変数の巻き上げ

JavaScript var キーワードで定義された変数は使用後に宣言できます。つまり、変数は先に使用してから宣言することができます(JavaScript 変数の巻き上げ)。

例

carName = "Volvo"; //ここで carName 変数を使用できます var carName;

試してみる »

const キーワードで定義された変数は使用後に宣言することはできません。つまり、変数は先に宣言してから使用する必要があります。

carName = "Volvo";    // 在这里不可以使用 carName 变量
const carName = "Volvo";
その他の拡張