ブロック

ブロック文 (他の言語では 複合文 とも呼ばれる) は 0 個以上の文をグループ化するのに使われます。ブロックは中括弧 (波括弧) の組で区切られ、場合によってはラベルが付くことがあります。

構文

ブロック文

{
  StatementList
}

ラベル付きブロック文

LabelIdentifier: {
  StatementList
}
StatementList
ブロック文の中でグループ化される文。
LabelIdentifier
省略可能なラベルで、視覚的な識別のため、または break のターゲットとして使われます。

解説

ブロック文は、他の言語ではよく複合文と呼ばれます。これは複数の文を JavaScript からみて1つの文にまとめるために使用します。ブロック内に複数の文をまとめることは、 JavaScript ではよく行われることです。反対の動作は空文を使用することで実現でき、これは1つの文が必要な場所に文を置かずにおくことができます。

ブロックは、 if...elsefor 文との組み合わせでよく使用されます。

ブロックスコープのルール

非厳格モードにおける var または関数定義の場合

非厳格モードでは、 var の宣言や、関数宣言で作成された変数は、ブロックスコープを持ちません。ブロック内で導入された変数は、それを含んでいる関数またはスクリプトがスコープとなり、変数を設定した効果は、そのブロック自体を超えて持続します。言い換えれば、ブロック文はスコープをもたらしません。例えば、

var x = 1;
{
  var x = 2;
}
console.log(x); // 2 が出力されます

これが 2 を出力するのは、ブロックの中の var x 文がブロックより前と同じスコープを持つからです。

非厳格モードでは、ブロック内の関数定義は奇妙な動きをします。使用しないでください。

厳格モードにおける letconst、関数宣言の場合

対照的に、 letconst で宣言された識別子は、ブロックスコープを持ちます。

let x = 1;
{
  let x = 2;
}
console.log(x); // 1 が出力されます

この x = 2 は、それが定義されたブロックのスコープに制限されています。

同じことが const にも言えます。

const c = 1;
{
  const c = 2;
}
console.log(c) // 1 が出力され、 SyntaxError は発生しない...

ブロックスコープを持つ const c = 2 は、ブロック内で固有に宣言することができるため、 SyntaxError: Identifier 'c' has already been declared を発生させないことに注意してください。

厳格モードは ES2015 に導入され、ブロック内の関数がそのブロックのスコープを持ちます。 ES2015 より前では、ブロックレベルの関数は厳格モードで禁止されていました。

仕様書

仕様書
ECMAScript Latest Draft (ECMA-262)
Block statement の定義

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
blockChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 11Opera 完全対応 3Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり

凡例

完全対応  
完全対応

関連情報