我已经开始学习并使用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语法,还是可能有某种优化/性能改进?
答案 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)中(禁止,比如说,函数表达式),我会说在需要时有一个明确的返回更好;这表明了意图。