Javascript 无法得到正确的表达
如何将以下JavaScript写入CoffeeScriptJavascript 无法得到正确的表达,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)更为常见,因此歧义被分解为两种陈
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)