2

我已经开始学习和使用 CoffeeScript好几天了,我正在使用以下Coffee to JavaScript 和 JavaScript to Coffee转换器,因为我是 CoffeScript 语法的新手。

上面的转换器完美地将 JavaScript “翻译”为 CoffeScript 语法,但我最近需要做相反的事情。因此,我已将 CoffeeScript 中的以下代码传递给 JavaScript 转换器功能:

$(document).ready ->
  $('.b-date-picker').datepicker
    onSelect: (date) ->
      if $(this).attr('name').indexOf('gteq') > 0
        $(this).parent().next().find('input').datepicker 'option', 'minDate', date
      else
        $(this).parent().prev().find('input').datepicker 'option', 'maxDate', date

结果 JavaScript 与我最初通过获取 CoffeScript 语法的结果相同,除了几乎每一行都有一个return语句:

$(document).ready(function() {
  return $('.b-date-picker').datepicker({
    onSelect: function(date) {
      if ($(this).attr('name').indexOf('gteq') > 0) {
        return $(this).parent().next().find('input').datepicker('option', 'minDate', date);
      } else {
        return $(this).parent().prev().find('input').datepicker('option', 'maxDate', date);
      }
    }
  });
});

所以,我开始想知道为什么要放置这些回报。这也是转换器中设置的正确 JavaScript 语法,还是有某种优化/性能改进?

4

2 回答 2

1

CoffeeScript 使用“函数式语法”,因为即使语句充当表达式。生成的代码是它在 JS 中的模拟方式(实际上,areturn ?:会更精确,但这是一个更简单的转换)。

现在,考虑这个 CoffeeScript:

() ->
  if cond
    a()
    undefined
  else
    b()
    undefined

在这种情况下,每个分支映射到return void 0(读取:)return undefined每个转换器。更智能的转换器可以安全地省略这样的 return 语句(也就是说,不需要任何 JS return 语句来产生等效的结果),但它不是在那个工具中完成的。

如果没有这样的未定义值是最后一个评估的表达式,CoffeeScript无法知道表达式的未定义结果是否实际使用,并且必须假设使用了函数的结果,这就是它在返回语句中添加的原因每个可能的分支。

但是,在没有“函数式语法”(例如,函数表达式除外)的语言(JS)中,我想说在需要时最好有一个明确的返回;这表明意图。

于 2013-07-04T21:00:11.657 回答
1

您不必从 JavaScript 函数返回值。

转换器可能非常智能 - 并且可能已经看到内部方法调用(对 jQuery)返回一个值(它返回 jQuery 对象)并且该值未被使用 - 或者它可能被过度简化或正在实现特定的实践。

于 2013-07-04T20:54:24.123 回答