2012-04-17 11 views
2

私はループ内の関数を生成したいと思います:cocoのループで関数を生成する方法は?

for own k, v in t 
    ctor::[k] = -> 
    v(...) 
    @ 

はしかし、ココはただ一つの関数を生成し、それを再利用するようだ:

var k, v, __ref, __own = {}.hasOwnProperty; 
for (k in __ref = t) if (__own.call(__ref, k)) { 
    v = __ref[k]; 
    ctor.prototype[k] = __fn; 
} 
function __fn(){ 
    v.apply(this, arguments); 
    return this; 
} 

出力は次にするためにココスクリプトを変更する方法:

var k, v, __ref, __own = {}.hasOwnProperty; 
for (k in __ref = t) if (__own.call(__ref, k)) { 
    v = __ref[k]; 
    ctor.prototype[k] = function() { 
    v.apply(this, arguments); 
    return this; 
    } 
} 

明確化:私はこの言語を意味ココで:http://satyr.github.com/coco/(CoffeeScriptのフォーク)。

+0

は、[この](http://coco.tomaszewskiweb.com/)について、あなたは "ココ" 話しているですあなたはそこに結合letを使用する必要がありますか? – Pointy

+0

@Pointy:https://github.com/satyr/coco#readme – Matt

+0

はい、coffeescriptフォークthx @Mattと思います。説明のために –

答えて

2

これは機能です。ループ内に直接functionを書き込むことは、ほとんどの場合避けなければなりません。 JSLintは「ループ内で機能を作ってはいけない」と言っていません。

あなたのコードは特にスコープのバグを持っています(動的に作成されたメソッド内のすべてvは同じ値を参照します)。コンパイル

for own k, v in t 
    let 
    ctor::[k] = -> 
     v ... 
     this 

var k, v, __ref, __own = {}.hasOwnProperty; 
for (k in __ref = t) if (__own.call(__ref, k)) { 
    v = __ref[k]; 
    (__fn.call(this, k, v)); 
} 
function __fn(k, v){ 
    ctor.prototype[k] = function(){ 
    v.apply(this, arguments); 
    return this; 
    }; 
} 
+0

+1 Thx。 –

関連する問題