2013-04-27 31 views
0

我寫的CoffeeScript是這樣的:如何在CoffeeScript中運行功能循環

split_typer_text = typer_text.split '' 
test = (char) -> 
    setTimeout (-> element.text(element.text() + char)), 100 
test char for char in split_typer_text 

但CoffeeScript的編譯器是這樣的:

test = function(char) { 
    return setTimeout((function() { 
     return element.text(element.text() + char); 
    }), 100); 
    }; 
    _results = []; 
    for (_i = 0, _len = split_typer_text.length; _i < _len; _i++) { 
    char = split_typer_text[_i]; 
    _results.push(test(char)); 
    } 
    return _results; 

我想要運行的功能,並不需要一個數組。 怎麼辦?

回答

0

當我編譯源,我得到這個...

var char, split_typer_text, test, _i, _len; 

split_typer_text = typer_text.split(''); 

test = function(char) { 
    return setTimeout((function() { 
    return element.text(element.text() + char); 
    }), 100); 
}; 

for (_i = 0, _len = split_typer_text.length; _i < _len; _i++) { 
    char = split_typer_text[_i]; 
    test(char); 
} 

也許更新您的CoffeeScript ...

bash-3.2$ coffee --version 
CoffeeScript version 1.6.2 
+0

我的代碼是: - > split_typer_text = typer_text.split '' 測試=(char)的 - > 的setTimeout( - > element.text(element.text()+字符)),100 測試炭爲char in split_typer_text – MarioDu 2013-04-27 10:04:30

+0

是的 - 因爲它在你的問題。當我用coffeescript進行編譯時,我把我的答案放在了我的答案中。你得到了不同的東西 - 我懷疑你的咖啡標記是舊的或修改過的版本。更新你的咖啡腳本,你會得到像我的結果。 – 2013-04-27 12:09:27

0

您正在運行的測試功能,就在這裏:

_results.push(test(char)); 
#-------------^^^^^^^^^^ 

一切都是CoffeeScript中的表達式,並且包含for循環。 for循環的結果是一個數組,因此編譯的JavaScript中的_results數組和_results.push

在某些情況下,CoffeeScript編譯器可以保證for循環的值不會被使用,因此編譯時可以優化_results的東西。例如,在此的CoffeeScript:

f = -> 
    i for i in [0..11] 
    42 

for環路值保證永遠不會被使用,從而有在JavaScript沒有數組:

var f; 

f = function() { 
    var i, _i; 

    for (i = _i = 0; _i <= 11; i = ++_i) { 
    i; 
    } 
    return 42; 
}; 

Demo

然而,在這種情況下,for循環是函數的返回值,以便在需要數組:

f = -> 
    i for i in [0..11] 

,你會看到在JavaScript正在填充陣列:

var f; 

f = function() { 
    var i, _i, _results; 

    _results = []; 
    for (i = _i = 0; _i <= 11; i = ++_i) { 
    _results.push(i); 
    } 
    return _results; 
}; 

Demo

如果您確定不想浪費時間使用數組,那麼您必須告訴CoffeeScript數組將不會被使用,您如何實現這一點取決於上下文。例如,你可以添加一個空return,表明周邊功能不返回任何內容:

f = -> 
    i for i in [0..11] 
    return 

,你會得到這樣的:

var f; 

f = function() { 
    var i, _i; 

    for (i = _i = 0; _i <= 11; i = ++_i) { 
    i; 
    } 
}; 

Demo