本文へスキップ
BecomeCoder

JavaScriptコース · 第8章 関数を深く知る ― スコープ・クロージャ・this · レッスン30

クロージャ ― 関数が変数を覚えておく

ブラウザで完結

導入

関数は、自分が作られた場所の変数覚えたまま持ち歩けます。この仕組みをクロージャと呼びます。「状態を隠して持つ関数」を作れる、JavaScript の強力な機能です。

説明

関数の中で関数を作って返すと、内側の関数は外側の変数を覚え続けます。

function makeCounter() {
  let count = 0;          // この変数を…
  return function () {
    count += 1;           // …内側の関数が覚えている
    return count;
  };
}

const next = makeCounter();
console.log(next());  // 1
console.log(next());  // 2
console.log(next());  // 3

countmakeCounter の中だけの変数で、外から直接いじれません。それでも next() を呼ぶたびに値が増えます。これが「状態を閉じ込めて持つ」クロージャの働きです。

引数を覚えさせて、専用の関数を量産することもできます。

function makeAdder(n) {
  return (x) => x + n;   // n を覚えた関数を返す
}

const add10 = makeAdder(10);
const add100 = makeAdder(100);
console.log(add10(5));    // 15
console.log(add100(5));   // 105

makeCounter から作った別のカウンターは、それぞれ独立した count を持ちます。

const a = makeCounter();
const b = makeCounter();
console.log(a());  // 1
console.log(a());  // 2
console.log(b());  // 1 ← b は別物なので 1 から

やってみよう

makeAdder で好きな数を足す関数を作ったり、カウンターを2つ作って値が独立していることを確かめましょう。

演習

makeAdder(n) を定義し、引数 n を足す関数を返してください。makeAdder(10) で作った関数に 5 を渡した結果を表示します。

ヒント1を見る

function makeAdder(n){ return (x) => x + n; } のあと const add10 = makeAdder(10); console.log(add10(5));

実際に動かしてみよう

下のエディタにJavaScriptを書いて「実行」を押すと、ブラウザ内のJavaScriptで出力が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう(console.log の結果が下に出ます。input() を使う回は「標準入力」欄に値を入れてから実行します)。

JavaScript — ブラウザ内で実行

ブラウザ本体のJavaScriptで実行する学習用環境を読み込みます(外部エンジン不要・軽量です)。
スクロールして表示された時点でも自動で読み込まれます。