2

ループで関数を生成したい:

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

ただし、cocoは1つの関数のみを生成し、それを再利用しているようです。

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;
}

cocoスクリプトを変更して次の出力を作成する方法:

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/(コーヒースクリプトフォーク)。

4

1 に答える 1

2

それは機能です。ループ内で直接書き込むfunctionことは、ほとんどの場合避けてください。JSLintは、「ループ内で関数を作成しないでください」と言って禁止しています。

特にコードにはスコープのバグがあります(v動的に作成されたメソッドのすべてが同じ値を参照します)。letそこでバインディングを使用する必要があります。

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;
  };
}
于 2012-04-17T14:14:43.180 に答える