簡単な例

たとえば下のコード。

var myObject = function(){
	var value=0;
	return{
		increment: function(){
			value +=1;
		},
		getValue: function(){
			return value;
		}
	};
}();

このコードでは変数myObjectに対して、incrementとgetValueというメソッドを持つオブジェクトが代入されています。


increamentとgetValueは、外側にある無名関数の変数valueにアクセスしていますよね。これがクロージャ。たぶん。


「でもこの無名関数が実行された後は変数valueは消えちゃうんじゃないの?」とか普通は思いますよね。


ところが驚くべきことに、いったんmyObjectが生成されたあとも、incrementメソッドとgetValueメソッドはこの変数valueにアクセスできてしまいます。

myObject.getValue();
>>0
myObject.increment();
myObject.increment();
myObject.increment();
myObject.getValue();
>>3

クロージャすげえ!