coffeescript总是回来

时间:2013-08-19 13:55:12

标签: javascript coffeescript

所以我有一个关于Coffee Script的愚蠢问题。我给它第二次机会,但为什么它会返回 所有内容

与函数的最后一个语句/行有什么关系?以及如何禁用此功能?把评论或其他东西作为最终的“表达”,我知道这是一个“记录”的特征,但没有;不,不是真的,我如何返回 到处并保存下载/执行时间?

这种行为肯定会让jit过来?

(locate =
    getPosition: () ->
        # Check we support geolocation
        throw Exception 'Your browser doesn\'t support location based services!' if !navigator.geolocation

        navigator.geolocation.getCurrentPosition (pos) ->
            console.log pos
)

编译到

(function() {
  var locate;

  locate = {
    getPosition: function() {
      if (!navigator.geolocation) {
        throw Exception('Your browser doesn\'t support location based services!');
      }
      return navigator.geolocation.getCurrentPosition(function(pos) {
        return console.log(pos);
      });
    }
  };

}).call(this);

[编辑]

我关心的原因是这只是我构建的应用程序的一个非常大的库之一,如果我们说有500个函数,其中200个对dom执行某些操作而不是返回类似数字或对象的内容,额外的200次返回是我不想要或不需要的额外1.2k数据。

此外,一个没有返回的函数,返回undefined和一个返回null的函数,无需解释。如果我愚蠢到足以检查这一点,那就是全面错误。

我确信会有一些性能差异,但我不知道这一点,而且现在我没有时间做一些jsperfs,但我会感兴趣。

Undefined and null

2 个答案:

答案 0 :(得分:5)

是的coffeescript将始终返回该函数的最后一行。它可以做到这一点,因为coffeescript中的所有内容都是表达式。

来自docs

  

一切都是表达(至少,尽可能多)

     

您可能已经注意到,即使我们没有将返回语句添加到CoffeeScript函数中,它们仍会返回它们的最终值。 CoffeeScript编译器尝试确保语言中的所有语句都可以用作表达式。观察返回如何在下面的函数中下推到每个可能的执行分支中。

可以看到他们的例子here

您仍然可以使用return声明

进行短路返回
  

即使函数总是返回它们的最终值,但是当你知道你已经完成时,它既可以并且被鼓励从函数体提前返回,写出显式返回值(返回值)。

答案 1 :(得分:0)

这是因为它是函数的最后一个语句/行,是的。默认情况下,functions in CoffeeScript always return a value。这通常不是一件坏事,但如果您真的不想返回任何内容,则可以添加return行。

如果您想要返回特定内容,可以将其作为函数的最后一行:

(locate =
    getPosition: () ->
        # Check we support geolocation
        throw Exception 'Your browser doesn\'t support location based services!' if !navigator.geolocation

        navigator.geolocation.getCurrentPosition (pos) ->
            console.log pos
            'Return this string'

        return
)

JS:

var locate;

locate = {
  getPosition: function() {
    if (!navigator.geolocation) {
      throw Exception('Your browser doesn\'t support location based services!');
    }
    navigator.geolocation.getCurrentPosition(function(pos) {
      console.log(pos);
      return 'Return this string';
    });
  }
};