Odpowiedzi:
Myślę, że to przydatna konwencja dla wywołań zwrotnych, które są ostatnim argumentem funkcji. Zwykle dzieje się tak na przykład w przypadku interfejsu API Node.js. Mając to na uwadze:
delay = (ms, func) -> setTimeout func, ms
delay 1000, -> something param
To prawda, że narzuca to dodatkowe wywołanie funkcji w każdym setTimeout
utworzeniu; ale w dzisiejszych interpretatorach JS wada wydajności jest nieznaczna, chyba że robisz to tysiące razy na sekundę. (A zresztą, co robisz, ustawiając tysiące limitów czasu na sekundę?)
Oczywiście, prostszym podejściem jest po prostu nazwanie twojego wywołania zwrotnego, co i tak generuje bardziej czytelny kod (jashkenas jest wielkim fanem tego idiomu):
callback = -> something param
setTimeout callback, 1000
setTimeout ( ->
something param
), 1000
Nawiasy są opcjonalne, ale rozpoczęcie linii przecinkiem wydawało mi się niechlujne.
setTimeout
i paren otwierające są ważne. Spacja oznacza, że nawiasy otaczają zamknięcie jako pierwszy parametr setTimeout; jeśli było to bezpośrednio po t, wówczas coffescript oczekiwałby, że nawiasy zawierają oba parametry.
setTimeout ->
something param
, 1000
something param
jest w tej samej linii co setTimeout
, jest analizowany inaczej.
Spowoduje to w przybliżeniu równoważne tłumaczenie (dzięki @Jel Mueller):
setTimeout (-> something param), 1000
Pamiętaj, że nie jest to dokładne tłumaczenie, ponieważ funkcja anonimowa zwraca wynik wywołania something(param)
zamiast niezdefiniowanego, jak w twoim fragmencie.
setTimeout (() -> something param), 1000
Uważam, że to najlepsza metoda, aby zrobić to samo,
setTimeout (-> alert "hi"), 1000