0

我这样写咖啡脚本:

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;

我想要运行功能,不需要数组。怎么做?

4

2 回答 2

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);
}

也许更新你的咖啡脚本......

bash-3.2$ coffee --version
CoffeeScript version 1.6.2
于 2013-04-27T09:47:31.387 回答
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;
};

演示

但是,在这种情况下,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;
};

演示

如果您确定不想在数组上浪费时间,那么您必须告诉 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;
  }
};

演示

于 2013-04-27T18:32:52.593 回答