【发布时间】: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 引擎会告诉你
a或b没有声明,如果确实没有声明的话。如果没有 ReferenceError,则声明这些标识符。我不是 Python 开发人员,但我知道它对缩进很敏感。没有意识到它的空白敏感度扩展到您在此处显示的级别。 -
静默失败?我真的希望它会引发关于数组不是函数的异常,这与您“过早返回”的体验相匹配。如果您的代码中没有任何内容捕获异常,您确实应该在控制台中收到错误。
-
@Bergi 不。什么都没有。我在排序之前和之后放置了一个日志语句,并且在方法返回之后还有一个。当它运行时,控制台中唯一的内容是方法返回之前和之后的语句。在我的经验中,javascript 中的静默失败确实很常见。我很惊讶这让你感到惊讶。一个关于“javascript静默失败”的简单谷歌搜索告诉我我并不孤单。
标签: javascript function coffeescript