2

我想循环生成函数:

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

然而,coco 似乎只生成一个函数并重用它:

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/(一个coffeescript fork)。

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 回答