Respostas:
Eu acho que é uma convenção útil para retornos de chamada virem como o último argumento para uma função. Geralmente é o caso da API do Node.js., por exemplo. Então, com isso em mente:
delay = (ms, func) -> setTimeout func, ms
delay 1000, -> something param
Concedido, isso adiciona a sobrecarga de uma chamada de função extra para cada coisa que setTimeout
você faz; mas nos intérpretes JS de hoje, a desvantagem do desempenho é insignificante, a menos que você o faça milhares de vezes por segundo. (E o que você está fazendo definindo milhares de tempos limite por segundo, afinal?)
Obviamente, uma abordagem mais direta é simplesmente nomear seu retorno de chamada, o que tende a produzir código mais legível de qualquer maneira (jashkenas é um grande fã desse idioma):
callback = -> something param
setTimeout callback, 1000
setTimeout ( ->
something param
), 1000
Os parênteses são opcionais, mas iniciar a linha com uma vírgula me pareceu confuso.
setTimeout
e o ponto inicial é importante. O espaço ali significa que os parênteses estão ao redor do fechamento como o primeiro parâmetro a setTimeout; se fosse logo após o t, o coffescript esperaria que os parênteses incluíssem os dois parâmetros.
setTimeout ->
something param
, 1000
something param
estiver na mesma linha que setTimeout
, será analisado de maneira diferente.
Isso resultará em uma tradução aproximadamente equivalente (obrigado @Joel Mueller):
setTimeout (-> something param), 1000
Observe que essa não é uma tradução exata porque a função anônima retorna o resultado da chamada em something(param)
vez de indefinida, como no seu snippet.
setTimeout (() -> something param), 1000
Acho esse o melhor método para fazer o mesmo,
setTimeout (-> alert "hi"), 1000