Как я могу написать следующий JavaScript в CoffeeScriptНе удается получить правильное выражение
foo.bar(function() {
doSomething();
})(x, y);
Например, следующий не работает:
foo.bar ->
doSomething()
(x, y)
Как я могу написать следующий 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 -> ...
и
(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
«S ничего не возвращает:
foo.bar(->
doSomething()
return
)(x, y)
Это станет this JavaScript:
foo.bar(function() {
doSomething();
})(x, y);
, и это именно то, что вы находясь в поиске.
Вы можете также использовать указанную функцию вместо анонимного одного:
pancakes = ->
doSomething()
foo.bar(pancakes)(x, y)
У вас еще есть возможная return
проблема уже отмечалось выше (и вы решаете, что точно так же), но, возможно, эта структура будет легче вы читаете и работаете; Я часто реорганизую вещи таким образом, если анонимная функция получает больше 5-10 строк, так как это упрощает мне структуру глазного шара.
Да, CoffeeScript не позволяет все JS может , из-за наших имплицитов. Просто используйте круглые скобки, будьте явными;).