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

構文

[Label:] { statement_1; statement_2; ... statement_n; }
statement_1, statement_2, statement_n
ブロック文の中でグループ化される文。
label
break のターゲットまたは視覚的識別のための、オプショナルな label

説明

この文は通常、制御フロー文 (たとえば、if...elseforwhile など) とともに使われます。たとえば:

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 が出力されるでしょう。

letconst の場合

対称的に、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 吐かない ...

ブロックスコープ constc = 2 は、ブロック内でユニークに宣言されているので、 SyntaxError を吐きません。 

仕様

仕様書 策定状況 コメント
ECMAScript 2017 Draft (ECMA-262)
Block statement の定義
ドラフト  
ECMAScript 2015 (6th Edition, ECMA-262)
Block statement の定義
標準  
ECMAScript 5.1 (ECMA-262)
Block statement の定義
標準  
ECMAScript 3rd Edition (ECMA-262)
Block statement の定義
標準  
ECMAScript 1st Edition (ECMA-262)
Block statement の定義
標準 最初期の定義。JavaScript 1.0 で実装。

ブラウザ実装状況

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本サポート (有) (有) (有) (有) (有)
機能 Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本サポート (有) (有) (有) (有) (有) (有)

関連情報

ドキュメントのタグと貢献者

 このページの貢献者: ambi, YuichiNukiyama, yyss, teoli, ethertank, Nanto vi, Mgjbot, Shimono
 最終更新者: ambi,