如何将以下JavaScript编写到CoffeeScript
中
foo.bar(function() {
doSomething();
})(x, y);
例如,以下内容不起作用:
foo.bar ->
doSomething()
(x, y)
答案 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);
这正是你要找的。 p>
您也可以使用命名函数而不是匿名函数:
pancakes = ->
doSomething()
foo.bar(pancakes)(x, y)
你仍然有上面提到的return
问题(并且你以同样的方式解决)但是这个结构可能更容易让你阅读和使用;如果匿名函数超过5-10行,我经常以这种方式重构事物,因为它使得结构更容易让我眼球。
答案 1 :(得分:0)
是的,由于我们的暗示,CoffeeScript不允许JS可以使用的所有内容。 只需使用括号,明确;)。