1. 3 件の閲覧数を合計する
  2. 何度呼んでも同じ結果になる
  3. 要素が 1 つだけ
  4. 空配列のとき
  5. すべて 0 のとき
コース一覧
JavaScript基礎文法:処理を組み立てる
変数のスコープ

JavaScript基礎文法:処理を組み立てる

if・switch による条件分岐、配列とループ、関数とコールバック、オブジェクトを順に組み立てる全 33 レッスン(525 分)の基礎文法コースです。FizzBuzz、作品リスト、関数への整理、作品データの構造化を通して、入力から結果を返す処理を自分で分解して書きます。DOM 操作は次のコースで扱います。

1
条件分岐
01. if 文の基本15分
02. if / else if / else で段階判定15分
03. switch 文で値を一覧から選ぶ15分
04. 条件を組み合わせる20分
05. FizzBuzz で複数条件を組み立てる20分
06. つくる 時間帯で挨拶を変える20分
07. 第1章まとめクイズ10分
2
配列とループ
01. 配列のきほん15分
02. 要素を足す・取り除く15分
03. for ループで合計を求める15分
04. for-of で配列を走査する15分
05. while で条件を満たす間くり返す15分
06. break と continue でループを制御する15分
07. つくる 作品リストを一覧にする20分
08. 第2章まとめクイズ10分
3
関数
01. 関数宣言15分
02. アロー関数15分
03. デフォルト引数15分
04. 早期 return でネストを浅くする15分
05. 変数のスコープ15分
06. コールバック関数15分
07. forEach で配列をまわす15分
08. つくる 処理を関数に整理する20分
09. 第3章まとめクイズ10分
4
オブジェクト
01. オブジェクトのきほん18分
02. オブジェクトで複数の値を返す16分
03. const と参照18分
04. ?. で安全に取り出す16分
05. 分割代入18分
06. スプレッド構文18分
07. find と includes で探す16分
08. つくる 作品データを構造化する25分
09. 第4章まとめクイズ10分

変数のスコープ

ブロックスコープ
解説

このレッスンで分かること

  • let と const で宣言した変数は、それを囲む { } の中だけで生きます
  • 作業用の変数を関数の外に置くと、2 回目の呼び出しに前回が残ります

2 回呼ぶと、前回の結果が混ざる

作業用の変数を、うっかり関数の外に置いてしまった例です。1 回目は正しく動くので、まず気付けません。

JavaScript

let line = ""; function joinTags(tags) { for (const tag of tags) { line += "#" + tag + " "; } return line; } console.log(joinTags(["HTML", "CSS"])); // => #HTML #CSS console.log(joinTags(["JavaScript"])); // => #HTML #CSS #JavaScript

2 回目に、前回のタグが残りました。line は関数の外にあるので、関数が終わっても値が消えないからです。しかもこの line を他の場所でも使っていたら、まったく関係のない画面の表示まで狂います。原因は joinTags の中にあるのに、症状は遠くに出る。これがいちばん追いにくいバグです。

変数が見えるのは、宣言した { } の中だけ

宣言した変数がどこから使えるか、という範囲をスコープと呼びます。let と const で宣言した変数は、それを囲んでいる { } の中だけで生きます。if でも for でも、{ } があればそこが境界です。

JavaScript

if (true) { const message = "公開中"; console.log(message); // 公開中 } console.log(message); // ReferenceError for (let i = 0; i < 3; i++) { console.log(i); // 0 1 2 } console.log(i); // ReferenceError

逆に、外側で宣言した変数は内側から見えます。内側から外側は見える、外側から内側は見えない。部屋の中からは廊下が見えるけれど、廊下から部屋の中は見えない、という関係です。

直し方は、宣言を関数の中に入れるだけ

さきほどの例は、let を 1 つ動かすだけで直ります。

JavaScript

function joinTags(tags) { let line = ""; for (const tag of tags) { line += "#" + tag + " "; } return line; }

line は呼ばれるたびに新しく作られ、関数が終われば消えます。外には何の影響も与えません。関数の中で使う作業用の変数は、必ず関数の中で宣言する。これを守るだけで、原因不明のバグの多くが消えます。

変数はできるだけ狭い範囲で宣言してください。範囲が狭ければ、その変数を気にしなければならない場所も狭くなり、読むのも直すのも楽になります。

解説

内側で外側と同じ名前を宣言すると、内側では外側が隠れます。これをシャドーイングと呼びます。外側を書き換えてしまうよりは安全ですが、同じ名前の変数が 2 つあることに読み手は気付きにくいので、内側では別の名前を付けるほうが親切です。

よくある間違い

  • ブロックの外で使おうとする — if の中で const result = ... と宣言し、if の外で return result; と書くとエラーになります。使う範囲でいちばん外側のブロックで宣言してください
  • 宣言そのものを書き忘れる — let も const も付けずにいきなり total = 0 と書くと、ローカル変数のつもりが外側への代入になります。エラーは出ないので、症状だけが遠くに現れます

要件

  1. 関数名は sumViews、引数は数値の配列 views 1 つにすること
  2. 合計を入れる変数は関数の中で let を使って宣言すること
  3. 関数の外の変数を書き換えないこと
  4. 空配列を渡されたら 0 を返すこと

入出力例

sumViews([120,80,45]) → 245 sumViews([120,80,45]) → 245 sumViews([10]) → 10 sumViews([]) → 0 sumViews([0,0,0]) → 0

ヒント

関数の中で使う作業用の変数は、必ず関数の中で宣言します

`let total = 0;` を関数の中に移し、外側の宣言を消してください

let や const を書き忘れると、宣言ではなく外側の変数への代入になります

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/05·更新 2026/08/26

関連レッスン

  • コールバック関数

    他の関数に引数として渡し、あとで呼んでもらう関数について学びます。第9章でボタンのクリックに反応させるとき、この仕組みがそのまま使われます。

  • forEach で配列をまわす

    配列の各要素に対してコールバック関数を順番に呼んでくれるメソッドを学びます。作品一覧の組み立てを forEach で書き直します。

  • つくる 処理を関数に整理する

    第6章で学んだ関数の書き方を総動員して、プロフィールページの文字列を組み立てます。挨拶と作品一覧を別々の関数に分けるのがポイントです。

  • 第3章まとめクイズ

    第6章で学んだ関数宣言とアロー関数、デフォルト引数、ガード節、スコープ、コールバックと forEach を 5 問で確認します。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 変数データに名前をつけて参照する仕組み
  • 関数処理に名前を付けて再利用できる単位
  • スコープ変数が参照可能な範囲
  • ロック「他の人触らないでね」と DB に予約する
  • 引数位置引数=順番で渡す。
  • 配列サイズ固定の同型データの集まり
main.js
学習モード
エディタを読み込んでいます

メモ

変数のスコープ

⌘S で保存