【问题标题】:Coffeescript array.sort(a,b) generates failing JSCoffeescript array.sort(a,b) 生成失败的 JS
【发布时间】:2016-10-18 00:08:58
【问题描述】:

我正在使用 coffeescript(1.11.1 版),但遇到了一些我难以描述的问题。我只是想按字段对对象数组进行排序,我可以这样做:

data.sort (a,b) ->
    if a.name < b.name then -1 else if a.name > b.name then 1 else 0

这会产生以下 javascript:

data.sort(function(a, b) {
  if (a.name < b.name) {
    return -1;
  } else if (a.name > b.name) {
    return 1;
  } else {
    return 0;
  }
});

太棒了。但在我的第一次尝试中,我这样做了:

data.sort(a,b) ->
    if a.name < b.name then -1 else if a.name > b.name then 1 else 0

而生成的 javascript 就是:

data.sort(a, b)(function() {
  if (a.name < b.name) {
    return -1;
  } else if (a.name > b.name) {
    return 1;
  } else {
    return 0;
  }
});

由于 javascript 非常有用,它会默默地失败(至少在 Chrome 中)并导致周围的函数过早返回。有点沮丧,但我会克服的。

首先我想确认这是预期的行为。我想可能是这样,我的脑海里闪过一些模糊的想法,关于它为什么会这样,但我希望能得到更坚定的理解。应该如何描述或与该语言的这一特性相关的术语是什么?

【问题讨论】:

  • 如果不是错误(如果我使用的是 CoffeeScript),我会发现这种级别的空白敏感度令人不安。
  • @squint 想得越多,我认为发生这种情况的原因是一个函数可以在 js 中返回一个函数,所以需要有一种方法来区分两者。 Coffeescript 具有语法上有意义的空格作为(ala Python),因此交易附带。真正的问题在于 JS 引擎。为什么它没有注销 a/b 未定义对我来说是深不可测的。
  • JS 引擎不是问题。 JS 引擎会告诉你 ab 没有声明,如果确实没有声明的话。如果没有 ReferenceError,则声明这些标识符。我不是 Python 开发人员,但我知道它对缩进很敏感。没有意识到它的空白敏感度扩展到您在此处显示的级别。
  • 静默失败?我真的希望它会引发关于数组不是函数的异常,这与您“过早返回”的体验相匹配。如果您的代码中没有任何内容捕获异常,您确实应该在控制台中收到错误。
  • @Bergi 不。什么都没有。我在排序之前和之后放置了一个日志语句,并且在方法返回之后还有一个。当它运行时,控制台中唯一的内容是方法返回之前和之后的语句。在我的经验中,javascript 中的静默失败确实很常见。我很惊讶这让你感到惊讶。一个关于“javascript静默失败”的简单谷歌搜索告诉我我并不孤单。

标签: javascript function coffeescript


【解决方案1】:

这是预期的行为。


CoffeeScript 支持以下所有功能:

  • (a, b) -&gt; 5 表示函数

  • -&gt; 5 表示不带参数的函数

  • f(a, b) 表示函数调用

  • f a 表示函数调用(隐式括号)。

那么如何用函数参数-&gt; 5调用函数调用f(a, b)的结果呢?

答案是——

f(a, b) -> 5

——正如你所注意到的,它看起来与——

f (a, b) -> 5

——转换为调用f,将函数(a, b) -&gt; 5作为参数传递。

【讨论】:

  • 感谢您确认这是意料之中的,但真正的问题是如何描述将空格后面的内容转换为参数的功能?或指向如何解释该语法的相关描述的链接。
  • function literal syntax is here 的描述。我听说过这种称为“隐式括号”的功能。该实现最好读作annotated source for the language grammarThe function literal is defined in it here.
  • @JimmyJames 我会说“(空白)空间作为函数应用运算符”
  • @Anko 感谢您的链接。函数文字会有所帮助,但我仍然不确定您所说的将空格后面的东西用作函数参数的功能。 Ruby 中也有类似的功能。
  • 我认为将do f 添加到调用无参数函数到如何在coffeescript 中调用函数的方式列表中将是一个很好的更新。
猜你喜欢
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多