3秒でわかる
波括弧やインデントで区切られた、複数の文をひとまとまりとして扱う範囲。if や for がどこまで効くかと、変数がどこまで生きるかがこの範囲で決まります。
30秒図解
もう少し詳しく
どういうものか
コードブロックは、複数の文をひとまとまりとして扱うための範囲です。if や for の本体、関数の中身、try の対象はいずれもブロックで、「この条件が成立したら、ここからここまでを実行する」の「ここからここまで」がブロックにあたります。
区切り方は言語で違い、C 系 (Java、JavaScript、Go、C) は波括弧、Python はインデント、Ruby は do ... end や波括弧を使います。見た目は違っても、範囲を決めているという役割は同じです。なお Markdown でバッククォート 3 つで囲んだコード表示のこともコードブロックと呼びますが、これは文書の記法であって、プログラムの構造とは別の話です。
なぜ必要か
ブロックが無いと、制御構文は次の 1 文にしか効きません。「条件が成立したときにまとめて 3 行実行したい」という当たり前の要求が書けなくなります。
もうひとつの役割がスコープです。多くの言語ではブロックの中で宣言した変数はブロックの外から見えません。これによって、遠くの関数の中で使った i や temp が別の場所と衝突する事故が防げます。
具体例
同じ処理を Python と JavaScript で書くと、区切り方の違いがはっきりします。
score = 82
if score >= 80:
grade = "A"
print("よくできました")
print(f"<a href="/glossary/evaluation" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">評価</a>は {grade} です")
print("判定を終了しました") # インデントが戻ったのでブロックの外const score = 82;
if (score >= 80) {
const grade = "A";
console.log("よくできました");
console.log(`評価は ${grade} です`);
}
// console.log(grade); // ここでは grade は見えない
console.log("判定を終了しました");つまずきやすいところ
IndentationError になる。見た目は揃っているのにエラーが出る場合はほぼこれで、エディタの「タブをスペースに変換」を有効にすると起きなくなりますif (x) doA(); に doB(); を足すと、doB() は条件に関係なく必ず実行されます。1 行でも波括弧を書いておけば起きませんvar の感覚のまま let を使い、ブロックの外から参照して ReferenceError になる。var は関数単位、let と const はブロック単位で生きる範囲が違います覚え方
ブロックは「効く範囲」と「見える範囲」を同時に決める箱です。閉じ括弧やインデントが戻った瞬間に、その箱は閉じています。