Javascript 无法得到正确的表达

Javascript 无法得到正确的表达,javascript,coffeescript,Javascript,Coffeescript,如何将以下JavaScript写入CoffeeScript foo.bar(function() { doSomething(); })(x, y); 例如,以下操作不起作用: foo.bar -> doSomething() (x, y) 大概是这样的: f -> ... (x, y) 在CoffeeScript中有点模棱两可,因为(x,y)本身就是一个有效的表达式。由于形式为f(g(x))和f(g)的事物比f(g)(x)更为常见,因此歧义被分解为两种陈

如何将以下JavaScript写入CoffeeScript


foo.bar(function() {
    doSomething();
})(x, y);
例如,以下操作不起作用:


foo.bar ->
    doSomething()
(x, y)
大概是这样的:

f ->
    ...
(x, y)
在CoffeeScript中有点模棱两可,因为
(x,y)
本身就是一个有效的表达式。由于形式为
f(g(x))
f(g)
的事物比
f(g)(x)
更为常见,因此歧义被分解为两种陈述:

f -> ...

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

foo.bar(->
    doSomething()
)(x, y)
这就变成了:

这可能与您试图实现的JavaScript具有相同的效果,也可能不具有相同的效果。如果
foo.bar
关心其参数的返回值,则

return doSomething();
而且

doSomething();
可能完全不同;CoffeeScript中的隐式“返回最后一个表达式的值”可能会让您绊倒。例如,如果迭代器函数完全返回
false
,将停止迭代,但如果迭代器完全不返回任何内容(即
undefined
),将继续迭代。如果
foo.bar
的行为是这样的,那么您可能需要明确声明
foo.bar
的参数不返回任何内容:

foo.bar(->
    doSomething()
    return
)(x, y)
这将成为:

这正是你想要的

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

pancakes = ->
    doSomething()
foo.bar(pancakes)(x, y)
您仍然有上面提到的可能的
返回
问题(并且您以相同的方式解决),但这种结构可能更易于阅读和使用;如果匿名函数的长度超过5-10行,我通常会用这种方式重构,因为它使结构更容易让我观察

foo.bar(->
    doSomething()
    return
)(x, y)
foo.bar(function() {
  doSomething();
})(x, y);
pancakes = ->
    doSomething()
foo.bar(pancakes)(x, y)