Ответы:
Я думаю, что это полезное соглашение для обратных вызовов в качестве последнего аргумента функции. Например, это обычно относится к API Node.js. Итак, имея в виду:
delay = (ms, func) -> setTimeout func, ms
delay 1000, -> something param
Конечно, это добавляет накладные расходы на дополнительный вызов функции для каждого, что setTimeout
вы делаете; но в современных интерпретаторах JS недостаток производительности незначителен, если вы не делаете это тысячи раз в секунду. (И вообще, что вы делаете, устанавливая тысячи тайм-аутов в секунду?)
Конечно, более простой подход состоит в том, чтобы просто назвать ваш обратный вызов, который в любом случае имеет тенденцию создавать более читаемый код (jashkenas - большой поклонник этой идиомы):
callback = -> something param
setTimeout callback, 1000
setTimeout ( ->
something param
), 1000
Скобки не обязательны, но начинка с запятой казалась мне грязной.
setTimeout
открывающим пареном важен. Пробел там означает, что круглые скобки окружают замыкание как первый параметр setTimeout; если бы это было непосредственно после t, то coffescript ожидал бы, что скобки заключают оба параметра.
setTimeout ->
something param
, 1000
something param
находится на той же строке, что setTimeout
и он анализируется по-разному.
Это приведет к примерно эквивалентному переводу (спасибо @Joel Mueller):
setTimeout (-> something param), 1000
Обратите внимание, что это не точный перевод, потому что анонимная функция возвращает результат вызова something(param)
вместо undefined, как в вашем фрагменте.
setTimeout (() -> something param), 1000
Я считаю, что это лучший способ сделать то же самое,
setTimeout (-> alert "hi"), 1000