var foo = function () {
var i, func;
i = 0;
func = function () {
print(++i);
func = null; // null を代入しても、この関数オブジェクトから「変数i」に対する参照は切れない
};
return func;
};
var hoge = foo();
hoge();
hoge();
hoge();
/*
func = null; は "func" という名前で関数オブジェクトに参照できなくなることを意味するらしい。
null を代入しても、関数オブジェクトは残り続ける。
なので、この場合は匿名関数を return した方がスマートだと思う。
*/
dmFyIGZvbyA9IGZ1bmN0aW9uICgpIHsKICB2YXIgaSwgZnVuYzsKCiAgaSA9IDA7CiAgZnVuYyA9IGZ1bmN0aW9uICgpIHsKICAgIHByaW50KCsraSk7CiAgICBmdW5jID0gbnVsbDsgLy8gbnVsbCDjgpLku6PlhaXjgZfjgabjgoLjgIHjgZPjga7plqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgYvjgonjgIzlpInmlbBp44CN44Gr5a++44GZ44KL5Y+C54Wn44Gv5YiH44KM44Gq44GECiAgfTsKCiAgcmV0dXJuIGZ1bmM7Cn07Cgp2YXIgaG9nZSA9IGZvbygpOwpob2dlKCk7CmhvZ2UoKTsKaG9nZSgpOwoKLyoKICBmdW5jID0gbnVsbDsg44GvICJmdW5jIiDjgajjgYTjgYblkI3liY3jgafplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgavlj4LnhafjgafjgY3jgarjgY/jgarjgovjgZPjgajjgpLmhI/lkbPjgZnjgovjgonjgZfjgYTjgIIKICBudWxsIOOCkuS7o+WFpeOBl+OBpuOCguOAgemWouaVsOOCquODluOCuOOCp+OCr+ODiOOBr+aui+OCiue2muOBkeOCi+OAggogIOOBquOBruOBp+OAgeOBk+OBruWgtOWQiOOBr+WMv+WQjemWouaVsOOCkiByZXR1cm4g44GX44Gf5pa544GM44K544Oe44O844OI44Gg44Go5oCd44GG44CCCiov