JavaScript のクロージャについて学びましょう(日本語)

JavaScript のクロージャは、関数とその周囲の状態(レキシカル環境)への参照が束ねられている概念です。

つまり、クロージャは内部関数が外部関数のスコープにアクセスできるようにします。JavaScript では、関数が作成されるたびにクロージャが生成され、関数の作成時に行われます。


クロージャの例

クロージャは、内部関数が外部関数の変数にアクセスできる構造を持っています。

この例では、outerFunctionは外部変数outerVariableを受け取り、内部に定義されたinnerFunctionを返します。closureExample変数には、outerFunctionを呼び出した結果、返されたinnerFunctionが格納されます。

クロージャはouterFunctionがすでに実行を終えた後でも、外部変数outerVariableにアクセスできるようにします。closureExampleを呼び出すと、外部変数と内部変数が出力されます。

このコードでは、closureExampleはouterVariableにアクセスできるクロージャです。クロージャは外部関数の変数への参照を保持し、内部関数でその変数を継続して使用できるようにします。

closure example

function outerFunction(outerVariable) {
    // 외부 함수의 변수를 참조하는 내부 함수 정의
    function innerFunction(innerVariable) {
        console.log("외부 변수: " + outerVariable);
        console.log("내부 변수: " + innerVariable);
    }

    // 내부 함수 반환
    return innerFunction;
}

// outerFunction을 호출하여 클로저 생성
var closureExample = outerFunction("외부 변수 값");

// 클로저 호출
closureExample("내부 변수 값");


追加説明

outerFunctionが呼び出され、innerFunctionが返される際、outervariableはクロージャの一部として含まれます。outerFunctionが実行を終えても、innerFunctionは引き続きoutervariableにアクセスできます。これは、クロージャが外部スコープで必要な変数への参照を保持するためです。クロージャは関数が完了した後でも必要な外部変数にアクセスできるようにします。

クロージャ(Closure)は、JavaScriptの基本的な概念であり、関数が自身のレキシカルスコープ(ソースコードで宣言された位置)から変数を記憶し、アクセスできる状況を指します。これにより、外部関数が実行を終えた後でもその関数の変数にアクセスできるようになります。クロージャは関数が周囲の状態に継続的にアクセスできるようにし、"閉じた(closed)"環境を作り出します。

レキシカル環境(Lexical Environment)は、関数が定義された位置によって決まる環境です。関数が定義されるとき、その関数のレキシカル環境はその関数が作成された場所の変数で構成されます。このレキシカル環境は、クロージャが外部変数にアクセスできるようにする重要な役割を果たします。

スコープチェーン(Scope Chain)は、関数が変数を探す際に使用するメカニズムです。関数が変数にアクセスしようとすると、JavaScriptは現在の関数のレキシカル環境から始めて外部関数のレキシカル環境まで遡りながら変数を探します。このプロセスによって、クロージャは外部変数にアクセスできるようになります。

scope

// Global Scope
const dataVar = "Kakao.GG";

function outerFunction() {
    // Parent Scope

    function innerFunction() {
        // Local Scope
        console.log(dataVar);
    }

    return innerFunction;
}

const closureExample = outerFunction();
closureExample(); // Output: Kakao.gg