无法得到正确的表达

时间:2013-10-06 15:14:44

标签: javascript coffeescript

如何将以下JavaScript编写到CoffeeScript


foo.bar(function() {
    doSomething();
})(x, y);

例如,以下内容不起作用:


foo.bar ->
    doSomething()
(x, y)

2 个答案:

答案 0 :(得分:1)

这样的事情:

f ->
    ...
(x, y)

在CoffeeScript中有点含糊不清,因为(x, y)本身就是一个有效的表达式。由于f(g(x))f(g)形式的内容比f(g)(x)更常见,因此歧义被解决为两个陈述:

f -> ...

(x, y)

当解析器以您不想要的方式解决歧义时,解决方案是通过用括号强制所需的解释来自行解决歧义:

foo.bar(->
    doSomething()
)(x, y)

那变为this JavaScript

foo.bar(function() {
  return doSomething();
})(x, y);

这可能会或可能不会与您尝试实现的JavaScript具有相同的效果。如果foo.bar关心其参数的返回值,那么

return doSomething();

只是

doSomething();

可能完全不同; CoffeeScript中隐含的“返回最后一个表达式的值”会让你失望。一个例子是jQuery's each,如果迭代器函数完全返回false,它将停止迭代,但如果迭代器根本没有返回任何内容(即undefined),它将继续。如果foo.bar的行为方式如此,那么您可能希望明确声明foo.bar的参数不会返回任何内容:

foo.bar(->
    doSomething()
    return
)(x, y)

那将成为this JavaScript

foo.bar(function() {
  doSomething();
})(x, y);

这正是你要找的。

您也可以使用命名函数而不是匿名函数:

pancakes = ->
    doSomething()
foo.bar(pancakes)(x, y)

你仍然有上面提到的return问题(并且你以同样的方式解决)但是这个结构可能更容易让你阅读和使用;如果匿名函数超过5-10行,我经常以这种方式重构事物,因为它使得结构更容易让我眼球。

答案 1 :(得分:0)

是的,由于我们的暗示,CoffeeScript不允许JS可以使用的所有内容。 只需使用括号,明确;)。