tutorial loop for function coffeescript parentheses

function - loop - Coffeescript: invocar la función con espacio antes de parens



coffeescript vs javascript (2)

Cuando invoco una función con un espacio antes de los parens, aparece un error que dice "no esperado".

sum = (a, b) -> a+b console.log (sum (1, 2))

error: inesperado,
console.log (sum (1, 2))

apunta a la coma entre 1 y 2

¿Por qué el comportamiento extraño?


En CoffeeScript puede escribir llamadas a funciones de dos maneras:

foo(bar) # with parens foo bar # without parens

Como tiene un espacio entre sum y (1, 2) , entonces está haciendo una llamada funcional sin sum de llamada que pasa (1, 2) como el primer parámetro, equivalente a esto:

bar = (1, 2) sum bar

El problema es que (1, 2) no es una expresión CoffeeScript válida. Para pasar dos parámetros, debes usar cualquiera de:

sum(1, 2) sum 1, 2


Los paréntesis sirven para varios propósitos en CoffeeScript; los propósitos que son relevantes aquí son:

  1. Agrupación dentro de expresiones.
  2. Llamadas de función.

Los paréntesis para las llamadas a funciones a menudo son opcionales, por lo que puede decir lo siguiente:

console.log 6, 11

y todo está bien El problema ocurre cuando hay cierta ambigüedad entre agrupar paréntesis y llamar a paréntesis de función. Considera esto:

f = (n) -> 2*n f (1 + 2) + 3

Cual es el resultado? Si los paréntesis son para agrupar, tenemos:

x = (1 + 2) + 3 # 6 f x # 12

pero si los paréntesis indican una llamada de función, entonces tenemos:

x = 1 + 2 # 3 y = f x # 6 y + 3 # 9

Por lo tanto, existe cierta ambigüedad sobre lo que significan los paréntesis y el resultado de la expresión depende de cómo se resuelva esa ambigüedad. Si hay un espacio entre el nombre de la función y el paréntesis de apertura:

f (1 + 2) + 3

luego CoffeeScript usa los paréntesis para agrupar y, completando los paréntesis opcionales, la llamada a la función se ve así:

x = (1 + 2) + 3 f(x)

Sin embargo, si no hay espacio, entonces se ve como:

x = (1 + 2) f(x) + 3

Entonces, si hay un espacio antes del paréntesis de apertura, CoffeeScript asume que debe completar los paréntesis implícitos para la llamada a la función; si no hay un espacio, los paréntesis se consideran explícitos en lugar de implícitos.

Ahora podemos ver su caso específico:

console.log (sum (1, 2))

Los espacios después de log y sum indican que los paréntesis se utilizan para agrupar y (1, 2) no es una expresión válida de CoffeeScript.

Regla de oro: si quiere (o necesita) usar paréntesis para indicar una llamada de función, entonces no coloque ningún espacio entre el nombre de la función y el paréntesis de apertura.