ブロック文 (他の言語では 複合文 とも呼ばれる) は 0 個以上の文をグループ化するのに使われます。ブロックは中括弧 (「波括弧」) の組で区切られ、場合によってはラベルが付くことがあります。
構文
ブロック文
{
StatementList
}
ラベル付きブロック文
LabelIdentifier: {
StatementList
}
解説
ブロック文は、他の言語ではよく複合文と呼ばれます。これは複数の文を JavaScript からみて1つの文にまとめるために使用します。ブロック内に複数の文をまとめることは、 JavaScript ではよく行われることです。反対の動作は空文を使用することで実現でき、これは1つの文が必要な場所に文を置かずにおくことができます。
ブロックは、 if...else や for 文との組み合わせでよく使用されます。
例
非厳格モード時の var または関数定義のブロックスコープの規則
非厳格モードでは、 var の宣言や、関数宣言で作成された変数は、ブロックスコープを持ちません。ブロック内で導入された変数は、それを含んでいる関数またはスクリプトがスコープとなり、変数を設定した効果は、そのブロック自体を超えて持続します。言い換えれば、ブロック文はスコープをもたらしません。例えば、
var x = 1;
{
var x = 2;
}
console.log(x); // 2 が出力されます
これが 2 を出力するのは、ブロックの中の var x 文がブロックより前と同じスコープを持つからです。
非厳格モードでは、ブロック内の関数定義は奇妙な動きをします。使用しないでください。
厳格モード時の let、 const、関数宣言のブロックスコープの規則
対照的に、 let と const で宣言された識別子は、ブロックスコープを持ちます。
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 (ECMA-262) Block statement の定義 |
ブラウザーの互換性
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
block | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 11 | Opera 完全対応 3 | Safari 完全対応 1 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 10.1 | Safari iOS 完全対応 1 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.1.100 |
凡例
- 完全対応
- 完全対応