📘

クロージャーを使ったプライベート変数の作成

に公開

クロージャーを使ったプライベート変数の作成について備忘録。

クロージャーとは?

内側に定義している関数からレキシカルスコープの変数を参照できる現象のことです。

プライベート変数とは?

外から参照できない変数のことです。

では、普通にオブジェクトを作ってしまったら?

let obj = {
    value: 0
};

console.log(obj.value); // 0

// オブジェクトの外から、変数を直接触ることができてしまう
obj.value = 2000;
console.log(obj.value); /2000

クロージャーを使ったプライベート変数を作ってみよう!

1. 関数を使ってスコープを作る

関数内で変数を宣言することで、その変数はその関数内でしか使えない変数になります。
これがプライベート変数です。

function subtractionFactory() {
    let count = 0; // このcountは関数の中だけからしか参照できない

    return {
        subtraction: function() {
            count--;
            console.log(count);
        },
        getCount: function() {
            return count;
        }
    };
}

2行目のcountは、外からは参照できない。

2. オブジェクトを返して、必要な操作だけ外に公開

const counter = subtractionFactory();

counter.subtraction(); // -1
counter.subtraction(); // -2

console.log(counter.subtraction()); // -3

console.log(counter.count); // undefined!外から直接アクセスできない

これで変数countは完全にプライベート変数になりました!

不思議だなあ、どうしてこんなことが可能なの?

関数subtractionや関数getCountから見ると、変数countは参照可能な変数ですが、関数subtractionFactoryの外から見ると、参照不可能な変数となるからです。

参考

Discussion