マルチプルインスタンスクロージャ(改)
先日マルチプルインスタンスに対応したクロージャを書いてみた。
http://d.hatena.ne.jp/Einherjar/20110909/p4
かなりゴチャゴチャしたコードで、もっと綺麗なやり方があるはずだと思っていた。
クロージャで一つ大きく勘違いしていることがあった。
以下のコードでenclosure関数を実行するごとにそのローカル変数cntは別物として確保される。そしてcntを内部に抱えたinner関数が返される。
ということはenclosure関数を実行するごとに、cntは別に確保され、クロージャとしてもマルチプルインスタンスは実現できている。
コンソールに出力して、2つのカウンタが別々に管理できていることが確認できた。
'use strict'; // closure // 内部関数を返されるのでcallCountが保持する。 function enclosure(){ var cnt = 0; // カウント値 // 内部関数innerから参照されるのでクロージャである。 // cntをインクリメントして返す。 // エンクロージャのローカル変数cntを参照するのでクロージャである。 function inner() { return ++cnt; } // 内部関数(クロージャ)を返す return inner; } var cnt0 = enclosure(); var cnt1 = enclosure(); console.log('cnt0:' + cnt0()); console.log('cnt0:' + cnt0()); console.log('cnt0:' + cnt0()); console.log('cnt1:' + cnt1()); console.log('cnt1:' + cnt1()); console.log('cnt0:' + cnt0()); console.log('cnt1:' + cnt1());