JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで別の関数を返す関数の作り方とクロージャの仕組み


JavaScriptで関数を返す関数とは

JavaScriptでは、関数の戻り値として別の関数を返すことができます。このテクニックは「クロージャ(closure)」と呼ばれる仕組みと密接に関係しており、返された関数は、外側の関数内で定義された変数にアクセスし続けることができるのが大きな特徴です。

以下は、JavaScriptで関数が別の関数を返すコード例です。

コード例

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
    body {
        font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
    }
    .result {
        font-size: 18px;
        font-weight: 500;
        color: blueviolet;
    }
</style>
</head>
<body>
<h1>Function returning another function in JavaScript</h1>
<div class="result"></div>
<button class="Btn">CLICK HERE</button>
<h3>Click on the above button to double the number</h3>
<script>
    let BtnEle = document.querySelector(".Btn");
    let resEle = document.querySelector(".result");
    function test() {
        let b = 1;
        return function () {
            resEle.innerHTML = "Number = " + (b *= 2);
        };
    }
    let returnFunc = test();
    BtnEle.addEventListener("click", () => {
        returnFunc();
    });
</script>
</body>
</html>

実行結果

上記のコードを実行すると、「CLICK HERE」ボタンが表示されます。ボタンをクリックするたびに、保持されている数値が2倍になり、その結果が画面に出力されます。

JavaScriptで別の関数を返す関数の作り方とクロージャの仕組み

実際に「CLICK HERE」ボタンをクリックすると、クリックごとに数値が2倍ずつ増えていく様子が確認できます。

JavaScriptで別の関数を返す関数の作り方とクロージャの仕組み

コードの解説

このコードのポイントは、test() 関数の中で宣言された変数 b と、それを操作する無名関数の関係です。

  • test() を呼び出すと、変数 b = 1 が定義され、戻り値として新しい無名関数が返されます。
  • let returnFunc = test(); の時点で test() が実行され、返された関数が returnFunc に代入されます。
  • ボタンをクリックするたびに returnFunc() が実行され、クロージャによって保持された変数 b に対して b *= 2 が適用されます。

通常、関数の実行が終わるとローカル変数は破棄されますが、クロージャを使うことで内部の関数が変数への参照を維持できます。そのため、クリックの回数だけ値が2倍になっていくという動作が実現できています。このように「関数を返す関数」は、状態の保持やカウンターの実装など、さまざまな場面で活用できる強力なパターンです。

  1. JavaScriptの関数プロトタイプとは?仕組みと使い方を解説

    JavaScriptで作成されたすべての関数には、JavaScriptエンジンによって自動的にprototypeプロパティが追加されます。このprototypeプロパティはオブジェクトであり、デフォルトではconstructorプロパティを含んでいます。関数のプロトタイプには、以下のようにしてアクセスできます。functionName.prototypeコンストラクタ関数を使ってオブジェクトを生成する場合、このprototypeプロパティを活用することで、同じコンストラクタから作成された複数のオブジェクト間でメソッドやプロパティを効率的に共有することができます。これにより、各インスタンスごとに

  2. JavaScriptでのメソッド借用:call()・apply()・bind()の使い方を解説

    JavaScriptでは、call()、apply()、bind()という3つのメソッドを使うことで、あるオブジェクトが持つメソッドを別のオブジェクトが「借用」できます。これは、本来そのメソッドを持たないオブジェクトに対して、thisの参照先を差し替えてメソッドを実行できる便利なテクニックです。 3つのメソッドの違い call():引数をカンマ区切りで個別に渡し、即座に関数を実行します。 apply():引数を配列(または配列風オブジェクト)として渡し、即座に関数を実行します。 bind():thisを固定した新しい関数を返すだけで、即座には実行されません。返された関数は後から好きなタイミン