¿Por qué ES6 no tiene funciones de flecha delgada?

16

ES6 agregó funciones de flecha de grasa ( =>), que tienen dos diferencias principales con respecto a las funciones normales:

  • sintaxis más corta (incluido el retorno implícito si usa un cuerpo de expresión única)
  • heredar thisdel alcance circundante

Ambas son características muy útiles, pero me parecen completamente separadas en su valor y aplicación; a veces quiero una, o la otra, o ambas, o ninguna. Parece extraño que si quiero usar una función de sintaxis corta, también tengo que usar el thiscomportamiento de modificación. Y viceversa. No veo por qué estas dos capacidades se implementan como una sola adición al lenguaje.

¿Qué sucede si quiero usar una función de sintaxis corta para su retorno implícito y brevedad (en algún contexto donde un completo function (..) { return ...}sería un poco menos legible), pero quiero usar thisen mi función para referirme al contexto de llamada? No hay forma de hacer esto.

CoffeeScript tiene ambas funciones ->y =>estilo, y aparentemente ES6 tomó prestado el =>estilo a partir de ahí. Entonces mi pregunta es, ¿por qué ES6 tampoco tomó prestado el ->estilo?

callum
fuente
Las funciones de flecha de grasa tienen otras diferencias, como tampoco pueden unirse arguments.
DeadMG
Si a veces todo lo que desea es el alcance circundante, siempre puede vincularse thisal cierre en una declaración de función completa. Sin embargo, esta podría no ser la parte que le preocupa.
Ben

Respuestas:

25

Consulte la propuesta para agregar funciones de flecha: http://wiki.ecmascript.org/doku.php?id=harmony:arrow_function_syntax 1

Lo que dice es:

Sin embargo, no queremos CoffeeScript's ->, es confuso tener dos flechas y dinámico este enlace es una pistola de pie disparada con frecuencia.

También puede ver un análisis de una versión anterior de la propuesta que también tenía la sintaxis ->: https://esdiscuss.org/topic/arrow-function-syntax-simplified

Parece que se reduce a lo siguiente:

  1. Tener dos sintaxis de flecha con una semántica sutilmente diferente aumentaría las complicaciones y la confusión.
  2. La dinámica de este enlace de la función () y ->rara vez se consideró útil, y un pistolero.
  3. Si realmente necesita este enlace dinámico, aún puede usar function (), tener una sintaxis de acceso directo no fue muy útil.
Winston Ewert
fuente
1
+1. Tenga en cuenta específicamente que ES6 es el segundo intento de introducir estas características, que originalmente se planearon para su inclusión en ES4, pero la especificación se abandonó cuando se hizo evidente que las principales partes interesadas pensaban que era demasiado complejo y que probablemente rompería la compatibilidad con versiones anteriores. Mantener todo lo más simple posible debe haber sido un objetivo importante para el comité esta vez.
Jules
1
Gracias por su respuesta, pero no creo que lo cubra. Menos no significa más simple; Yo diría que es más complejo tener que cambiar entre dos sintaxis de funciones muy diferentes solo para obtener una lógica diferente de esta vinculación (en comparación con cambiar un solo carácter). Tener "múltiples tipos de funciones con semántica variable" no es una idea terrible; es exactamente lo que tenemos de hecho. Y no veo qué tiene que ver la compatibilidad con versiones anteriores con nada de lo que estamos hablando. No estoy sugiriendo que deberían haber eliminado el soporte para la sintaxis de función clásica, si eso es lo que quieres decir
callum
2
@callum, el consenso (al menos entre las personas que toman esta decisión) es que el function()estilo de este enlace fue un error y es una verruga en el lenguaje. Si pudieran, cambiarían function()para tener =>semántica, pero no pueden porque eso rompería la compatibilidad con versiones anteriores.
Winston Ewert
2
@ WinstonEwert espera, ¿está diciendo que las personas que toman la decisión hubieran preferido si pudieran cambiar function()para heredar thisdel alcance circundante como lo =>hace? En ese caso, ¿no se thisreferiría simplemente al objeto global en todas partes? Suena raro. ¿De dónde has oído eso?
callum
3
Esto puede tener una respuesta aceptada, pero parece un mal diseño del lenguaje. Si tiene un idioma que requiere una flecha gruesa, entonces también debería estar disponible una flecha delgada. El primero obliga a todos a comenzar a pensar en términos de objetos, mientras que el segundo reconoce primero la historia de javascripts del diseño funcional y el contexto diferido.
Core