やりたいこと
increment関数を数回呼び、1ずつインクリメントされるような動作を実現したい。
問題点
このコードだと、numがインクリメントされるが、numという変数がどこでも初期化可能なため、書き換えられると、うまくいかない。
let num = 0;
function increment() {
num += 1;
console.log(num);
}
increment();
increment();
increment();
num = 0;
increment();
解決策
クロージャーを使ってprivateな変数を定義すれば解決する。
- incrementFactoryという関数の中で、numを宣言し、increment関数を作成する。
- incrementFactoryで、作成したincrement関数を返り値とする。
- incrementFactory関数を呼び出し、実行。
incrementFactoryは一度しか呼ばれていないため、numも一度しか初期化されない。
途中でnum=0としているが、これに影響されずにインクリメントできている。
尚、修飾子なしで宣言できる理由についてはよくわかっていない。
function incrementFactory() {
let num = 0;
function increment() {
num += 1;
console.log(num);
}
return increment;
}
const increment = incrementFactory();
increment();
increment();
increment();
num = 0;
increment();
参考
【JS】ガチで学びたい人のためのJavaScriptメカニズム
https://www.udemy.com/course/javascript-essence/?couponCode=ST6MT42324