ちょっとずつ違う関数オブジェクトをたくさん作る方法
いろいろ教えていただきました。
id:mopemopeさんの方法
function createFunc(i){ var value = i; return function(a){ print(a+value); } } var f = []; for (var i=0; i<10; i++) { f[i] = {foo: createFunc(i)}; }
うまくいかないようなマヌケなコメントをワタシが書いていますがばっちり動作しました。mopemopeさん,ごめんなさい。
js> f[0].foo(10) 10 js> f[1].foo(10) 11 js> f[3].foo(10) 13 js>
魔神降臨malaさんの案。
f = []; for (i=0; i<10; i++) { f[i] = (function(){return {foo:function(a){print(a+i)}}})(i); }
ところが。
js> f[0].foo(10) 20 js> f[1].foo(10) 20 js> f[2].foo(10) 20
あれ?
もう1つの方を試してみました。
Number.prototype.times = function(f){for(var i=0;i<this;i++) f(i)} f = []; (10).times(function(i){ f[i] = {foo:function(a){print (a+i)}} });
こっちはバッチリ。
js> f[0].foo(10) 10 js> f[1].foo(10) 11 js> f[2].foo(10) 12
id:brazilさんのは短くてすっきり。
var f = []; for (var i=0; i<10; i++) f[i] = (function(b){return function(a){print(a + b)}})(i)
ちゃんと動作します。
js> f[0](10) 10 js> f[1](10) 11 js> f[9](10) 19
というわけで,とても勉強になった一日でした。