Как генерировать функции в цикле в кокос?

Я хотел бы генерировать функции в цикле:

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).

1 ответ

Решение

Это особенность. Пишу 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;
  };
}
Другие вопросы по тегам