ブロック文 (他の言語では 複合文 とも呼ばれる) は 0 個以上の文をグループ化するのに使われます。ブロックは中括弧 (波括弧) の組で区切られ、場合によっては labelled が付くことがあります。
構文
[Label:] { statement_1; statement_2; ... statement_n; }
statement_1,statement_2,statement_n- ブロック文の中でグループ化される文。
- label
breakのターゲットまたは視覚的識別のための、オプショナルなlabel。
説明
この文は通常、制御フロー文 (たとえば、if...else、for、while など) とともに使われます。たとえば:
while (x < 10) {
x++;
}
ブロック文はセミコロンで終わらないので、注意してください。
ブロック文は、他の言語で 複合文 と呼ばれることがあります。これは JavaScript でひとつの文しか想定していない場所で、複数の文が使えるになるものです。複数の文をブロックに収めることは、JavaScript で一般的に行われます。これと逆のことが、空文で行えます。こちらは、文が必要な場所に文を置かないことができます。
ブロックスコープのルール
var の場合
var で宣言した変数は、ブロックスコープを持ちません。ブロック内で導入された変数は、それを含んでいる関数またはスクリプトがスコープとなり、変数を設定した効果は、そのブロック自体を超えて持続します。言い換えれば、ブロック文はスコープを導入しません。"スタンドアローン" なブロックは有効な構文ですが、JavaScript ではスタンドアローンなブロックを使わないほうがいいでしょう。ブロックが C や Java のブロックのように思うかもしれませんが、実際のブロックは思ったとおりにはならないからです。例えば:
var x = 1;
{
var x = 2;
}
alert(x); // 2 が出力されます
上記コードでは 2 が出力されます。なぜなら、条件文の中の文 var x が条件文の前の文 var x と同じスコープ内にあるからです。ブロックスコープを持つ C 言語や Java なら、同等なコードで 1 が出力されるでしょう。
let と const の場合
対称的に、let と const で宣言された識別子は、ブロックスコープを持っています。
let x = 1;
{
let x = 2;
}
console.log(x) // 1 が出力されます
この x = 1 は、それが定義されたブロックのスコープに制限されます。
同じことが const にも言えます:
const c = 1;
{
const c = 2;
}
console.log(c) // 1 が出力され、SyntaxError 吐かない ...
ブロックスコープ const の c = 2 は、ブロック内でユニークに宣言されているので、 SyntaxError を吐きません。
仕様
ブラウザ実装状況
| 機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| 基本サポート | (有) | (有) | (有) | (有) | (有) |
| 機能 | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|---|
| 基本サポート | (有) | (有) | (有) | (有) | (有) | (有) |