クロージャとは何ですか。どんなときに使いますか

関数が、作られた場所の変数を覚えたまま使える仕組み。数を数える例で示し、使い道と気をつける所まで答えます。

こう聞かれます

  • 「クロージャとは何ですか。どんなときに使いますか」
  • 「関数を返す関数を書いたことはありますか」
  • 「外側の関数が終わったあとも、中の変数を使えるのはなぜですか」

面接官が見ている点

  • 言葉の定義だけでなく、短いコードで動きを示せるか
  • 「変数を外から触れないように閉じ込める」という使い道を言えるか
  • ループと var の組み合わせで起きる不具合を、クロージャの見方で説明できるか

短い答え

  • クロージャは、関数が作られた場所の外側の変数を、覚えたまま使い続けられる仕組みです。
  • 外側の関数が終わっても、返された関数から変数を読み書きできるので、外から直接触れない状態を持てます。
  • 数を数える関数や、設定を覚えた関数を作るとき、イベントで呼ばれる関数が外の値を使うときに働いています。

少し詳しい答え

数を数える関数

makeCounter が終わっても、返した関数は count を覚えています。呼ぶたびに作られる count は別々です。

JavaScript

function makeCounter() {
  let count = 0;
  return () => {
    count += 1;
    return count;
  };
}
const a = makeCounter();
const b = makeCounter();
console.log(a());
console.log(a());
console.log(b());
1
2
1

count は外から直接は書き換えられません。増やす手段を返した関数だけに絞れるのが、クロージャの使い道です。

ループと let

あとで動く関数は、変数そのものを覚えています。var のループでは 1 つの i を全部の関数が共有するので、動くころには最後の値になっています。

JavaScript

for (var i = 0; i < 3; i++) {
  setTimeout(() => {
    console.log("var", i);
  });
}
var 3
var 3
var 3

let なら回るたびに新しい変数ができ、それぞれの関数が別の値を覚えます。

JavaScript

for (let j = 0; j < 3; j++) {
  setTimeout(() => {
    console.log("let", j);
  });
}
let 0
let 1
let 2

作った物と結べると伝わりやすくなります。たとえば「同じ送信の処理を、送り先の住所だけ変えて何か所かで使いたかったので、住所を覚えた関数を返す関数を作った」のように話します。

よくある間違い

  • 「関数の中に関数を書くこと」とだけ言う 要点は、外側の変数を覚えたまま、外側の関数が終わったあとも使えることです
  • 値を写して覚えていると思う覚えているのは変数そのものです。あとで変数が変われば、関数から見える値も変わります
  • 定義だけ話してコードで示さない数を数える例のような 5 行ほどのコードを示すと、分かっていることが伝わります

深掘りの問い

  • 「クロージャで気をつけることは」 関数が残っている限り、覚えている変数も消えません。大きなデータを覚えたまま関数を残すと、メモリを使い続ける、と答えます
  • 「React の useState とクロージャは関係ありますか」 イベントの関数は、作られたときの state の値を覚えています。古い値を見てしまうときは、前の値を受け取る形で更新する、と答えます
  • 「クラスのプライベートなフィールドとの違いは」どちらも外から触れない状態を持てます。クラスは # を付けたフィールドで、クロージャは関数のスコープで閉じ込める、と答えます

確認日 2026年10月23日

技術面接問題の一覧へ戻る