📘
クロージャーを使ったプライベート変数の作成
クロージャーを使ったプライベート変数の作成について備忘録。
クロージャーとは?
内側に定義している関数からレキシカルスコープの変数を参照できる現象のことです。
プライベート変数とは?
外から参照できない変数のことです。
では、普通にオブジェクトを作ってしまったら?
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