Coffeescript - Como criar uma função anônima que se autoinicia?

Respostas:

160

Embora você possa apenas usar parênteses (por exemplo (-> foo)(), você pode evitá-los usando a dopalavra-chave:

do f = -> console.log 'this runs right away'

O uso mais comum de doé capturar variáveis ​​em um loop. Por exemplo,

for x in [1..3]
  do (x) ->
    setTimeout (-> console.log x), 1

Sem o do, você apenas estaria imprimindo o valor de xapós o loop 3 vezes.

Trevor Burnham
fonte
24
Você também pode escreverf = do -> console.log x
scribu
5
@scribu Bem, essas duas afirmações são muito diferentes, e a sua é realmente a que eu deveria ter dado. Mine atribui a função -> console.log 'this runs right away'a fe a executa; o seu executa a função e, em seguida, atribui seu resultado a f, como na pergunta original. (Embora no caso de console.log, o valor de retorno é sempre de undefinedqualquer maneira.)
Trevor Burnham
1
Exatamente. Além disso, você pode definir as propriedades do objeto desta forma:{f: do -> // something}
scribu
2
A partir do CoffeeScript 1.3.1 (lançado em abril de 2012), dotambém permite que você passe argumentos para a função. Para passar 1e 2como os parâmetros xe y, escreva do (x = 1, y = 2) ->. (A documentação para este recurso foi perdida , mas o problema em que o recurso foi introduzido tem alguns exemplos.)
Rory O'Kane
19

Se você deseja criar um "alias" para os argumentos passados ​​para a função de auto-invocação no CoffeeScript, digamos que isto é o que você está tentando alcançar:

(function ( global, doc ) {
  // your code in local scope goes here
})( window, document );

Então do (window, document) ->não vou deixar você fazer isso. O caminho a percorrer é com os parênteses:

(( global, doc ) -> 
  # your code here
)( window, document ) 
Misha Reyzlin
fonte
5
do (global=window, doc=document) ->
Billy Moon de
16

é ridículo fácil no café:

do ->

retornará

(function() {})();
mart7ini
fonte
5

Você também pode combinar a dopalavra-chave com os parâmetros de função padrão para propagar "funções de autoinicialização" recursivas com um valor inicial. Exemplo:

do recursivelyPrint = (a=0) ->
  console.log a
  setTimeout (-> recursivelyPrint a + 1), 1000
XåpplI'-I0llwlg'I -
fonte
5

tente usar

do ($ = jQuery) ->
Pavel Blagodov
fonte
3
do ->
    #your stuff here

Isso criará um encerramento autoexecutável, útil para definição do escopo.

Jordan Checkman
fonte
1
Isso não parece adicionar muitas informações novas em comparação com as outras respostas já postadas. Em vez de criar uma resposta competitiva, você pode agregar mais valor postando um comentário informativo sob outra resposta que acrescenta alguma clareza ou informações úteis à outra resposta.
still_dreaming_1
1

Desculpe, eu resolvi:

f = (
    () -> "something"
)()
user537339
fonte
1
@Squeegy Eu não diria isso necessariamente. A dopalavra-chave tem algumas limitações que às vezes tornam necessário usar a abordagem do estilo JS (consulte a edição 960 ); dofoi realmente adicionado apenas por causa do caso de uso de loop com fechamentos.
Trevor Burnham
1
Mas também não estamos usando o CoffeeScript para nos dar um soco na cara.
Brandon
0

Deveria ser

f = () ->
  # do something
Alongkorn Chetasumon
fonte