Coffeescript - ¿Cómo crear una función anónima autoiniciada?

Respuestas:

160

Si bien puede usar paréntesis (por ejemplo (-> foo)(), puede evitarlos usando la dopalabra clave:

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

El uso más común de does capturar variables en un bucle. Por ejemplo,

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

Sin el do, solo estaría imprimiendo el valor de xdespués del ciclo 3 veces.

Trevor Burnham
fuente
24
También puede escribirf = do -> console.log x
scribu
5
@scribu Bueno, esas dos declaraciones son muy diferentes, y la tuya es en realidad la que debería haber dado. El mío asigna la función -> console.log 'this runs right away'a f, luego la ejecuta; el tuyo ejecuta la función y luego asigna su resultado a f, como en la pregunta original. (Aunque en el caso de console.log, el valor de retorno es siempre de undefinedtodos modos.)
Trevor Burnham
1
Exactamente. Además, puede definir las propiedades del objeto de esta manera:{f: do -> // something}
scribu
2
A partir de CoffeeScript 1.3.1 (publicado en abril de 2012), dotambién le permite pasar argumentos a la función. Para pasar 1y 2como los parámetros xy y, escribir do (x = 1, y = 2) ->. (La documentación de esta función se ha perdido , pero el problema en el que se introdujo la función tiene algunos ejemplos).
Rory O'Kane
19

Si desea "alias" los argumentos pasados ​​a la función autoinvocada en CoffeeScript, digamos que esto es lo que está tratando de lograr:

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

Entonces do (window, document) ->no te dejará hacer eso. El camino a seguir es con parens entonces:

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

es ridículamente fácil en el café:

do ->

volverá

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

También puede combinar la dopalabra clave con los parámetros de función predeterminados para generar "funciones de autoiniciación" recursivas con un valor inicial. Ejemplo:

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

tratar de usar

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

Esto creará un cierre autoejecutable, que es útil para establecer el alcance.

Jordan Checkman
fuente
1
Esto no parece agregar mucha información nueva en comparación con las otras respuestas ya publicadas. En lugar de crear una respuesta competitiva, puede agregar más valor al publicar un comentario informativo debajo de otra respuesta que agregue algo de claridad o información útil a la otra respuesta.
still_dreaming_1
1

Disculpas, lo resolví:

f = (
    () -> "something"
)()
usuario537339
fuente
1
@Squeegy No necesariamente diría eso. La dopalabra clave tiene algunas limitaciones que hacen que sea necesario utilizar el enfoque de estilo JS en ocasiones (consulte el número 960 ); doen realidad solo se agregó debido al caso de uso de bucle con cierres.
Trevor Burnham
1
Pero tampoco estamos usando CoffeeScript para golpearnos en la cara de esa manera.
Brandon
0

Debería ser

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