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.


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 ) 

5
do (global=window, doc=document) ->
Billy Moon de

16

é ridículo fácil no café:

do ->

retornará

(function() {})();

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


3
do ->
    #your stuff here

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


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"
)()

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.