JavaScript是否总是返回语句/值?

时间:2013-07-04 20:50:16

标签: javascript syntax coffeescript return

我已经开始学习并使用CoffeeScript几天了,我正在使用以下Coffee to JavaScript and 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语法,还是可能有某种优化/性能改进?

2 个答案:

答案 0 :(得分:1)

您不必从JavaScript函数返回值。

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

答案 1 :(得分:1)

CoffeeScript使用“功能语法”,其中偶数语句充当表达式。生成的代码是如何在JS中模拟的(实际上,return ?:会更精确,但这是一个更简单的转换。)

现在,请考虑一下这个CoffeeScript:

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

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

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

然而,在没有“功能语法”的语言(JS)中(禁止,比如说,函数表达式),我会说在需要时有一个明确的返回更好;这表明了意图。