2011-04-09 24 views

Respuesta

1

Disculpas, lo resolví:

f = (
    () -> "something" 
)() 
+0

http://jashkenas.github.com/coffee-script/ hay un ejemplo de cierre en ese país. – kjy112

+8

Esta no es la forma de escritura de café. Incluso si funciona –

+1

@Squeegy No necesariamente diría eso. La palabra clave 'do' tiene algunas limitaciones que hacen que sea necesario utilizar el enfoque del estilo JS a veces (consulte [problema 960] (https://github.com/jashkenas/coffee-script/issues/960)); 'do' realmente solo se agregó debido al caso de uso de lazo con cierres. –

160

Mientras que sólo puede utilizar paréntesis (por ejemplo (-> foo)(), se pueden evitar mediante el uso de la palabra clave do:

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

El uso más común de do está capturando variables en un bucle. Por ejemplo,

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

Sin la do, sólo serías imprimiendo el valor de x después del bucle 3 veces.

+1

+1 wow, no sabía que podría usarse de esa manera. ¡Increíble! –

+24

También puedes escribir 'f = do -> console.log x' – scribu

+5

@scribu Bueno, esas dos afirmaciones son muy diferentes, y la tuya es la que debería haber dado. Mine asigna la función '-> consola.log 'this runs now'' to 'f', luego lo ejecuta; yours 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 siempre es' undefined' de todas formas) –

19

Si desea "Alias" los argumentos que se pasan a la función de auto-invocando en CoffeeScript, y 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 va a dejar que hagas eso . La forma de hacerlo es con parens a continuación:

((global, doc) -> 
    # your code here 
)(window, document) 
+4

'do (global = window, doc = document) ->' –

5

tratar de utilizar

do ($ = jQuery) -> 
5

También es posible combinar la palabra clave do con los parámetros por defecto en funciones a la semilla "funciones de auto-iniciación" recursivos con un valor inicial . Ejemplo:

do recursivelyPrint = (a=0) -> 
    console.log a 
    setTimeout (-> recursivelyPrint a + 1), 1000 
15

que es ridículo fácil en el café:

do -> 

volverá

(function() {})(); 
3
do -> 
    #your stuff here 

Esto creará un auto ejecución de cierre, que es útil para la determinación del alcance.

+1

Esto no parece agregar una gran cantidad de información nueva en comparación con las otras respuestas ya publicadas. En lugar de crear una respuesta competitiva, puede agregar más valor publicando un comentario informativo en otra respuesta que agregue algo de claridad o información útil a la otra respuesta. –

0

Debe ser

f =() -> 
    # do something 
Cuestiones relacionadas