2013-04-27 3 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 '' тест = (символ) -> SetTimeout (-> element.text (element.text() + символ)), 100 тест символ для char в split_typer_text – MarioDu

+0

yes - как есть в вашем вопросе. Когда я компилирую это с помощью coffeescript, я получаю сообщение, которое я вставляю в свой ответ.Вы получаете что-то другое - и я подозреваю, потому что ваш кофейник является старой или измененной версией. обновите свой coffeescript, и вы получите результаты, подобные моим. –

0

Вы запускаете функцию тестирования, прямо здесь:

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

Все это выражение в CoffeeScript и включает цикл for. Результатом цикла for является массив, следовательно массив _results и _results.push в скомпилированном JavaScript.

В некоторых случаях компилятор 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.

Смежные вопросы