Как генерировать функции в цикле в кокос?
Я хотел бы генерировать функции в цикле:
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;
};
}