講師のKです。
プログラミングの学習が進んでくると、最初に出てきた「変数ってそもそも何?」という疑問を持つ人もいると思います。
実は経験者でもときどきハマるほど奥が深いテーマなんです。

最近の書籍や記事では、変数を宣言する際に const を使うことを推奨する例をよく見かけます。
今回は、この const の使い方について、スコープ(変数の生きる場所)やブロックの話も交えながら、注意点を深掘りしてみましょう。

スコープとブロックって何?

プログラムの中では、変数が使える範囲(有効な場所)が決まっています。この範囲のことを「スコープ」と呼びます。

  • スコープ:変数が生きている範囲。部屋や箱のようにイメージするとわかりやすいです。
  • ブロック{ } で囲まれた部分のこと。1つのブロックは1つのスコープを作ります。
{
  // ここが1つのブロック
  const x = 900;
  console.log(x); // 使える
}
console.log(x); // エラー!ブロックの外なので使えない

つまり、同じブロックの中では同じ名前の const 変数を2回宣言できませんが、別のブロックなら同じ名前を使ってもOKです。

では、次の例を考えてみましょう!
コードのすぐ下に答えと解説がありますので、自分で考えたい人はコードの前で一度ストップするのがおすすめです。

① 次のコードはエラーになる?ならない?

const tumbler = 'これはタンブラー';
for (let i = 0; i < 3; i++) { 
  tumbler = 'これはタンブラーです';
  console.log(tumbler);
}

② 次のコードはエラーになる?ならない?

const tumbler = 'これはタンブラー';
const tumbler = 'これはタンブラーです';

③ 次のコードはエラーになる?ならない?

for (let i = 0; i < 3; i++) {
  const tumbler = 'これはタンブラーです';
  console.log(tumbler);
}

答え:エラーになりません。
for のループは、1回まわるごとに新しいブロック(スコープ)が作られます。
そのため毎回別の tumbler が作られる扱いになり、再宣言エラーにはなりません。

④ 次のコードはエラーになる?ならない?

for (const i = 0; i < 3; i++) {
  const tumbler = 'これはタンブラーです';
  console.log(tumbler);
}

⑤ 次のコードはエラーになる?ならない?

function cup(){
  const tumbler = 'これはタンブラーです';
  console.log(tumbler);
}
let timer = setInterval(cup, 1000);

答え:エラーになりません。
毎回 cup 関数の中という「別のスコープ」で tumbler が新しく作られるためです。

いかがでしたか?
const は「再代入できない」だけでなく、「同じスコープで再宣言できない」という特徴もあります。
ブロック( { } )が新しくなると、別スコープとして扱われる点を覚えておくと、エラーの理由がわかりやすくなります。

Crebit では、学習者が混乱しないよう基本的には let を使っていますが、const を使うときは今回の例を思い出して注意してみてください。
こうした仕組みを理解していくことが、プログラム上達の大きな一歩になります!