2012-04-17 55 views
2

我想在一個循環中產生的功能:如何在coco循環中生成函數?

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的叉)。

+0

是[這](http://coco.tomaszewskiweb.com/)的 「COCO」 你說什麼? – Pointy 2012-04-17 13:04:25

+0

@Pointy:我相信它的https://github.com/satyr/coco#readme – Matt 2012-04-17 13:05:47

+0

是的,一個coffeescript fork,thx @Matt。 – 2012-04-17 13:08:41

回答

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

+1 Thx解釋。 – 2012-04-17 14:24:57