2

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

这与成为函数的最后一个语句/行有关吗?以及如何禁用它?将评论或其他内容作为最终的“表达”,我知道这是一个“记录在案”的功能,但不是;不,这不是真的,我怎么到处都没有回报并节省下载/执行时间?

当然,这种行为有点搞砸了?

(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 return 是我不想要或不需要的额外 1.2k 数据。

另外,没有返回undefined的函数,返回和返回null良好的函数,无需解释。如果我愚蠢到去检查这个,那将是全面错误的。

我敢肯定会有一些性能差异,但我不知道,现在我没有时间做一些 jsperfs,但我会感兴趣。

未定义和空

4

2 回答 2

5

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

文档

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

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

他们的例子可以在这里看到

return您仍然可以使用该语句进行短路返回

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

于 2013-08-19T13:58:46.740 回答
0

这是因为它是函数的最后一个语句/行,是的。默认情况下,CoffeeScript 中的函数总是返回一个值。这通常不是一件坏事,但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';
    });
  }
};
于 2013-08-19T13:59:45.560 回答