【问题标题】:how to run function in coffeescript for loop如何在coffeescript for循环中运行函数
【发布时间】:2013-04-21 11:05:30
【问题描述】:

我这样写咖啡脚本:

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;

我想要运行函数,不需要数组。 怎么办?

【问题讨论】:

    标签: arrays for-loop coffeescript


    【解决方案1】:

    当我编译那个源代码时,我得到了这个......

    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
    

    【讨论】:

    • 我的代码是:-> split_typer_text = typer_text.split '' test = (char) -> setTimeout (-> element.text(element.text() + char)), 100 test char for split_typer_text 中的字符
    • 是的 - 正如你的问题一样。当我用咖啡脚本编译它时,我得到了我在答案中的输出。你得到了一些不同的东西——我怀疑是因为你的咖啡脚本是旧的或修改过的版本。更新你的咖啡脚本,你会得到和我一样的结果。
    【解决方案2】:

    您正在这里运行测试功能:

    _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.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-08
      • 2021-08-31
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 2020-05-23
      相关资源
      最近更新 更多