JavaScriptにおけるクロージャーを使ったカウンター
以前に検討したコードを書き直して、
返される関数が変数 num の値を
毎回1ずつ増加させるようにしてみましょう:
function test() {
let num = 1;
return function() {
console.log(num);
num++; // 1を加算
}
}
let func = test();
結果として、関数 func を呼び出すたびに
コンソールに新しい値が表示されることになります:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
}
}
let func = test();
func(); // 1を表示
func(); // 2を表示
func(); // 3を表示
func(); // 4を表示
func(); // 5を表示
これで、クロージャー(より正確には、関数の
クロージャーにある変数 num)を
使って関数呼び出しのカウンターを実装できた
ことになります。
注意点として、関数 test を呼び出すたびに
新しい関数が返され、それぞれが独自の
クロージャーを持ちます。つまり、異なる
カウンターは独立して動作します:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // 1つ目のカウンター
func1(); // 1を表示
func1(); // 2を表示
let func2 = test(); // 2つ目のカウンター
func2(); // 1を表示
func2(); // 2を表示
つまり、同じ変数 num が異なる関数に対して
異なる値を持つことになるのです!
関数 test を2回呼び出した場合、
そこから得られる関数は独立して動作し、
各関数は独立した変数 num を
持つことになります。
私のコードを見ずに、自分自身で、 クロージャーを使って動作する関数呼び出し カウンターを実装してみてください。
クロージャー内の関数に数値 10 を
保持させてください。そして、関数が呼び出される
たびにこの数値を 1 ずつ減らし、
減少後の数値をコンソールに表示するように
してください。
前の課題を修正して、カウントダウンが
0 に達した後、それ以降の関数呼び出し
ではコンソールにカウントダウン終了のメッセージを
表示するようにしてください。