このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docsコミュニティーについてもっと知り、仲間になるにはこちらから。
ブロック
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
ブロック文 は 0 個以上の文をグループ化するのに使われます。ブロックは中括弧(「波括弧」)の組で区切られ、0 個以上の文または宣言のリストを含みます。
In this article
試してみましょう
var x = 1;let y = 1;if (true) { var x = 2; let y = 2;}console.log(x);// Expected output: 2console.log(y);// Expected output: 1構文
{ StatementList}StatementListブロック文の中でグループ化される文や宣言です。
解説
ブロック文は、他の言語ではよく複合文と呼ばれます。これは複数の文を JavaScript からみて 1 つの文にまとめるために使用します。ブロック内に複数の文をまとめることは、JavaScript では、特にif...else andfor などのフロー制御文との関連で良く行われることです。反対の動作は空文を使用することで実現でき、これは 1 つの文が必要な場所に文を置かずにおくことができます。
さらに、let、const、class などのブロックスコープ宣言と組み合わせることで、IIFE のように、一時変数がグローバル名前空間を汚染するのを防ぐことができます。
非厳格モード時の var または関数定義のブロックスコープの規則
非厳格モードでは、var の宣言や、関数宣言で作成された変数は、ブロックスコープを持ちません。ブロック内で導入された変数は、それを含んでいる関数またはスクリプトがスコープとなり、変数を設定した効果は、そのブロック自体を超えて持続します。言い換えれば、ブロック文はスコープを作成しません。例えば、
var x = 1;{ var x = 2;}console.log(x); // 2これが 2 を出力するのは、ブロックの中のvar x 文がブロックより前と同じスコープを持つからです。
非厳格モードでは、ブロック内の関数定義は奇妙な動きをします。使用しないでください。
厳格モード時の let、const、関数宣言のブロックスコープの規則
対照的に、let、const、class で宣言された識別子は、ブロックスコープを持ちます。
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 を発生させないことに注意してください。
厳格モードでは、ブロック内の関数宣言はそのブロックのスコープを持ち、巻き上げられます。
"use strict";{ foo(); // "foo" と出力 function foo() { console.log("foo"); }}foo(); // ReferenceError: foo is not defined例
>for ループの本体としてブロック文を使用する
for ループは本体として単一の文を受け入れます。
for (let i = 0; i < 10; i++) console.log(i);ループ本体で複数の文を使用したい場合は、1 つのブロック文にまとめることができます。
for (let i = 0; i < 10; i++) { console.log(i); console.log(i ** 2);}ブロック文を使用したデータのカプセル化
let とconst の宣言は、それを含むブロックのスコープになります。これにより、データを関数で包むことなく、グローバルスコープから隠すことができます。
let sector;{ // これらの変数はこのブロックのスコープであり、 // ブロックの後でアクセスすることはできません。 const angle = Math.PI / 3; const radius = 10; sector = { radius, angle, area: (angle / 2) * radius ** 2, perimeter: 2 * radius + angle * radius, };}console.log(sector);// {// radius: 10,// angle: 1.0471975511965976,// area: 52.35987755982988,// perimeter: 30.471975511965976// }console.log(typeof radius); // "undefined"仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-block> |