我想在循环中生成函数:
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;
}
}
澄清:对于coco,我指的是这种语言:http://satyr.github.com/coco/ (coffeescript fork )。
最佳答案
这是一个功能。几乎总是应该避免直接在循环中编写function
。 JSLint 禁止它说“不要在循环内创建函数。”
您的代码尤其存在范围错误(动态创建的方法中的所有 v
将引用相同的值)。您应该在那里使用 let
绑定(bind):
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;
};
}
关于javascript - 如何在coco中循环生成函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10191806/