2011-09-12 18 views
112

Parece que CoffeeScript devuelve automáticamente el último elemento en un ámbito. ¿Puedo evitar esta funcionalidad?¿Hay alguna forma de no devolver algo con CoffeeScript?

+0

¿Por qué quieres? ¿No puedes descartar el valor devuelto cuando quieras? – Chris

+10

@Chris: cuando no hay un valor de retorno significativo, filtrar lo que sea el resultado de la última declaración no es una buena idea. – delnan

+10

@Chris esto puede tener implicaciones de rendimiento con las comprensiones/para/while loops también, ya que coffeescript puede recoger el resultado de cada iteración en una matriz, si se usa el valor de retorno del ciclo (o si es la última expresión de una función) – arnaud576875

Respuesta

143

tiene que devolver explícitamente nada, o para dejar una expresión evaluar a indefinido en la parte inferior de su función:

fun = -> 
    doSomething() 
    return 

O:

fun = -> 
    doSomething() 
    undefined 

Esto es lo que recomienda el doctor, cuando utilizando las comprensiones:

Tenga cuidado de no devolver accidentalmente los resultados de la comprensión en estos casos, por añadiendo un valor significativo retorno - como verdad - o nula, a la parte inferior de su función.


Se podría, sin embargo, escribir un envoltorio de la siguiente manera:

voidFun = (fun) -> 
    -> 
     fun(arguments...) 
     return 

(Note la splat operator aquí (...))

y utilizarlo como éste en la definición de funciones:

fun = voidFun -> 
    doSomething() 
    doSomethingElse() 

O así:

fun = voidFun(-> 
    doSomething() 
    doSomethingElse() 
) 
+0

Gracias por esta respuesta informativa. Yo también me he estado preguntando sobre esto ya que actualmente estoy aprendiendo coffeescript. Tengo curiosidad si puede arrojar algo de luz sobre cuál es la mejor opción, o cuál sería la peor opción al evitar el retorno de un valor. Específicamente, me han dicho que las opciones son agregar 'return',' undefined', o 'null' al final de mi función. Sin embargo, agregar 'null' me parece incorrecto por alguna razón. ¿Tengo razón en suponer que es la peor opción de las tres? – stefmikhail

+2

En javascript, una función sin declaración de devolución (o una declaración de devolución vacía) devuelve indefinido, por lo que la mejor opción es agregar una declaración vacía o dejar una 'sin definir' al final. El uso de una declaración 'return' vacía parece expresar * return nothing * better that dejando un' undefined' al final de la función, por lo que el 'return' vacío parece ser la mejor opción. – arnaud576875

+2

En lugar de 'fun (arguments ...)', sería mejor llamar a 'fun.apply (this, arguments)'. –

1
longRunningFunctionWithNullReturn = -> 
    longRunningFunction() 
    null 
0

Parece funciones en CoffeeScript siempre debe devolver algo, aunque null. En C, tiene void como tipo de devolución. ->, la función de vacío, compila a (function() {}), así que es la única función que no devuelve nada.

+0

Eso no es verdad. 'return;' funciona en C, JavaScript y CoffeeScript para devolver un valor nulo. – YoYoYonnY

5

Sólo algo divertido (ficticia)

suppressed = _.compose Function.prototype, -> 'do your stuff' 

Function.prototype en sí es una función que siempre devuelven nada. Puede usar componer para canalizar su valor de retorno en este agujero negro y la función compuesta nunca devolverá nada.

10

Sí, con un return como la última línea de una función.

Por ejemplo,

answer =() -> 
    42 

extrovert = (question) -> 
    answer() 

introvert = (question) -> 
    x = answer() 
    # contemplate about the answer x 
    return 

Si desea ver qué js el café compila a, tratar http://bit.ly/1enKdRl. (He usado redux CoffeeScript para mi ejemplo)

+1

downvoter, ¡comenten por favor! – gprasant

+1

Creo que fue downvoted porque esta respuesta no agrega ningún valor aparte de la que ya está allí en la respuesta más votado, que también se da 2 años antes de este! –

+1

Pero el ejemplo es genial. –

Cuestiones relacionadas