CoffeeScript总是以匿名函数返回。

5

我想写一些CoffeScript函数来检查表格中的所有复选框,当在th中选中复选框时。

我的CoffeScript函数如下:

$("table.tableview th input:checkbox").live 'click', -> 
  checkedStatus = this.checked
  $("table.tableview tbody tr td:first-child input:checkbox").each ->
      this.checked = checkedStatus

它很适合检查所有的框。但是当取消勾选时它不起作用。编译后的JS代码如下:

$("table.tableview th input:checkbox").live('click', function() {
  var checkedStatus;
  checkedStatus = this.checked;
  return $("table.tableview tbody tr td:first-child input:checkbox").each(function() {
    return this.checked = checkedStatus;
  });
});

它不能工作,因为在第一个设置为false之后,函数的返回值将为false。然而,我不知道如何抑制coffee script的默认返回行为。请帮帮我。

当我按Flambino的建议添加“true”时,我得到以下JS

$("table.tableview th input:checkbox").live('click', function() {
    var checkedStatus;
    checkedStatus = this.checked;
    $("table.tableview tbody tr td:first-child input:checkbox").each(function() {
        return this.checked = checkedStatus;
    });
    return true;
});

我只能通过这种方式将函数内的return语句全部放到最后:

$("table.tableview tbody tr td:first-child input:checkbox").each ->
    this.checked = checkedStatus
true

我做错了什么?非常感谢迄今为止提供的帮助。
2个回答

20

如果你只是在函数的最后一行使用return(或等价的undefined),那么CoffeeScript编译器会生成没有return的JS代码。因此,编写代码的最有效方法是:

$("table.tableview th input:checkbox").live 'click', -> 
  checkedStatus = this.checked
  $("table.tableview tbody tr td:first-child input:checkbox").each ->
    this.checked = checkedStatus
    return
  return

当然,你可以放心地省略第二个return。在jQuery中,只有false的返回值才会产生影响。

还有一种提议的语法(-/>)用于定义没有返回值的函数;请参见问题899


6
只需在函数的最后一行添加true,coffeescript 将编译 JS 以返回该值:
$("table.tableview th input:checkbox").live 'click', -> 
    checkedStatus = this.checked
    $("table.tableview tbody tr td:first-child input:checkbox").each ->
        this.checked = checkedStatus
    true

换句话说,CoffeeScript 总是返回最后一行的结果(就像 Ruby 一样)。
编辑(问题更新后): 再次强调,你无法阻止 CoffeeScript 返回函数中最后一行的值 - CoffeeScript 的一个重要特点就是这样做。
CoffeeScript 使用显著的空格缩进,所以缩进决定了哪些代码块应该放在一起 - 你的示例实际上是正确的。
$("table.tableview th input:checkbox").live 'click', -> 
    checkedStatus = this.checked
    $("table.tableview tbody tr td:first-child input:checkbox").each ->
        this.checked = checkedStatus
        true // cause this function (the each-iterator) to return true
    true // causes the click handler function to return true

这与在 JavaScript 中编写函数时使用 return true 没有区别。只需使用空格而不是 {} 来创建代码块。


是的。看起来没有办法抑制CoffeeScript的返回行为。https://github.com/jashkenas/coffee-script/issues/1401 - olooney
@Flambino 我已经理解到这个程度了。我的问题基本上已经在你的第一篇帖子中得到了回答;) 谢谢。但是,我遇到的问题是,如果我使用你建议的缩进,我最终会在错误的行上得到“return true”语句。结果发现我的文件中存在一些制表符与空格的问题,这破坏了CoffeeScript的“显著空格”范围。很高兴我找出了这个问题。再次感谢您的帮助。 - Gidogeek
@Gidogeek:嗯,要注意制表符和软制表符(空格)的区别。通常情况下,一个真正的制表符宽度相当于2-4个空格,但它仍然只计为1个空白字符。如果你的文本编辑器有“显示不可见字符”的选项,那会很有帮助,因为它应该能够清晰地显示制表符。 - Flambino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接