マルチプルインスタンスクロージャ(改)

先日マルチプルインスタンスに対応したクロージャを書いてみた。
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());