【问题标题】:Coffeescript implicit returns impact on performance and side effectsCoffeescript 隐式返回对性能和副作用的影响
【发布时间】:2015-05-18 04:06:24
【问题描述】:

我目前正在开发一个使用 Express.js 和 Mongoose 的 node.js Web 服务。最近,我想我会尝试使用 CoffeeScript,因为我听说有一些好处。但是,我注意到一些令人不安的事情,我想知道是否有人可以澄清一下。

这是我用纯 javascript 编写的路线之一:

router.post('/get/:id', decorators.isManager, function(req, res) {
    Group.findById(req.params.id, function(err, grp) {
            if(err) res.status(500).end();
            if(grp == null) res.status(500).send('The group could not be found');
            res.send(grp);
    });
});

但是,使用以下(几乎等效的咖啡脚本):

router.post '/get/:id', decorators.isManager, (req, res) ->
  Group.findById req.params.id, (err, grp) ->
    res.status(500).end() if err
    res.status(500).send 'The group could not be found' if not grp?
    res.send grp

将其重新编译为 javascript 会返回以下内容:

router.post('/get/:id', decorators.isManager, function(req, res) {
    return Group.findById(req.params.id, function(err, grp) {
            if(err) res.status(500).end();
            if(grp == null) res.status(500).send('The group could not be found');
            return res.send(grp);
    });
});

这些额外的回报会影响我的应用程序的性能,它会改变它的工作方式吗?我对其进行了测试,它似乎是相同的响应时间,但是我不确定这会对多个嵌套查询产生什么影响。谢谢!

【问题讨论】:

  • 如果您想明确返回任何内容,只需在 CoffeeScript 函数的末尾添加 return
  • 这是 Ruby 20 年来一直在做的事情。没关系。隐式回报很棒,您不必担心。

标签: javascript node.js express coffeescript


【解决方案1】:

好问题!这已在this pull request 中进行了广泛讨论。

关于性能

请记住,在性能方面,返回 undefined 或任何其他值几乎是等效的。

但是,所有差异都非常小,因此您不必担心。您可以在这个快速而肮脏的基准测试中比较实际的速度变化:http://jsperf.com/return-undefined-vs-value

一种特殊情况可能会造成更大的伤害:函数中的最后一条语句会生成一个数组。 CoffeeScript 将分配数组并为您返回。

例如在 CoffeeScript 中你可能会这样写:

state = 1

changeState = ->
  (state++ for i in [0..9])

将被转译为:

var changeState, state;

state = 1;

changeState = function() {
  var i, j, results;
  results = [];
  for (i = j = 0; j <= 9; i = ++j) {
    results.push(state++);
  }
  return results;
};

但你甚至不想要results,你只想添加到state

在这种情况下,最好的选择是添加一个空的return 语句:

state = 1

changeState = ->
  (state++ for i in [0..9])
  return

这会导致

var changeState, state;

state = 1;

changeState = function() {
  var i, j;
  for (i = j = 0; j <= 9; i = ++j) {
    state++;
  }
};

关于意外后果

CoffeeScript 永远不会改变您的代码的行为 - 除非您期望一个函数总是返回 undefined

不过,这并不常见,也不是很有用。如果你想检查返回值,可能会有一些东西。如果您从未使用过返回值,则返回某些内容无关紧要。

作为一名长期使用 CoffeeScript 的用户,我的看法是,您迟早会享受到隐式回报。它促使您以更functional 的方式写作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-15
    • 2011-09-16
    • 2021-11-02
    • 1970-01-01
    • 2013-08-13
    • 2012-08-01
    • 1970-01-01
    相关资源
    最近更新 更多