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.


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 ) 

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

16

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

do ->

volverá

(function() {})();

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


3
do ->
    #your stuff here

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


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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.