Por que o ES6 não possui funções de seta fina?

16

O ES6 adicionou funções de seta de gordura ( =>), que têm duas grandes diferenças em relação às funções normais:

  • sintaxe mais curta (incluindo retorno implícito se você usar um corpo de expressão única)
  • herdar thisdo escopo circundante

Esses são recursos muito úteis, mas me parecem completamente separados em seu valor e aplicação - às vezes eu quero um, ou outro, ou ambos, ou nenhum. Parece estranho que se eu quiser usar uma função de curto sintaxe, eu tenho de usar também o thiscomportamento -modifying. E vice versa. Não vejo por que esses dois recursos são implementados como uma única adição ao idioma.

E se eu quiser usar uma função de sintaxe curta para seu retorno e brevidade implícitos (em algum contexto em que um total function (..) { return ...}seria um pouco menos legível), mas eu quero usar thisem minha função para me referir ao contexto de chamada? Não há como fazer isso.

O CoffeeScript possui funções de estilo ->e =>, aparentemente, o ES6 pegou emprestado o =>estilo a partir daí. Então, minha pergunta é: por que o ES6 também não emprestou o ->estilo?

callum
fonte
As funções de seta gorda têm outras diferenças, como também não podem se ligar arguments.
DeadMG
Se, às vezes, tudo o que você deseja é o escopo ao redor, sempre é possível vincular thisao fechamento em uma declaração de função completa. Esta pode não ser a parte com a qual você está preocupado.
Ben

Respostas:

25

Veja a proposta de adicionar funções de seta: http://wiki.ecmascript.org/doku.php?id=harmony:arrow_function_syntax 1

O que diz é:

No entanto, não queremos que o CoffeeScript ->, é confuso ter duas setas e dinâmica essa ligação é uma arma de fogo frequentemente disparada.

Você também pode ver algumas discussões de uma versão anterior da proposta que também possuía a sintaxe ->: https://esdiscuss.org/topic/arrow-function-syntax-simplified

Parece que se resume ao seguinte:

  1. Ter duas sintaxes de flechas com semântica sutilmente diferente aumentaria a complicação e a confusão.
  2. A dinâmica desta ligação de function () e ->foi considerada raramente útil, e uma metralhadora.
  3. Se você realmente precisar dinamicamente dessa ligação, ainda poderá usar a função (), ter uma sintaxe de atalho não foi muito útil.
Winston Ewert
fonte
1
+1. Observe especificamente que o ES6 é a segunda tentativa de introdução desses recursos, que foram originalmente planejados para inclusão no ES4, mas a especificação foi abandonada quando ficou claro que as principais partes interessadas achavam que era muito complexo e provavelmente quebraria a compatibilidade com versões anteriores. Manter tudo o mais simples possível deve ter sido uma meta importante para o comitê dessa vez.
Jules
1
Obrigado pela sua resposta, mas acho que não cobre. Menos não significa mais simples; Eu diria que é mais complexo ter que alternar entre duas sintaxes de funções muito diferentes apenas para obter uma lógica de vinculação diferente (comparada à alternância de um único caractere). Ter "vários tipos de funções com semânticas variadas" não é uma idéia terrível; é exatamente o que realmente temos. E não vejo o que a compatibilidade com versões anteriores tem a ver com o que estamos falando. Não estou sugerindo que eles deveriam ter o apoio removido porque a sintaxe da função clássica, se é isso que você quer dizer
callum
2
@ callum, o consenso (pelo menos entre as pessoas que tomam essa decisão) é que o function()estilo dessa ligação foi um erro e é uma verruga no idioma. Se pudessem, mudariam function()para ter =>semântica, mas não podem, porque isso quebraria a compatibilidade com versões anteriores.
Winston Ewert
2
@WinstonEwert, espere, você está dizendo que as pessoas que tomaram a decisão teriam preferido se pudessem mudar function()para herdar thisdo escopo circundante, como =>faz? Nesse caso, não se thisreferiria apenas ao objeto global em qualquer lugar? Soa estranho. onde você ouviu isso?
Callum
3
Isso pode ter uma resposta aceita, mas parece um design de linguagem ruim. Se você tiver um idioma que exija uma seta gorda, também deverá estar disponível uma seta fina. O primeiro obriga todos a começar a pensar em termos de objetos, enquanto o segundo reconhece primeiro a história javascripts do design funcional e o contexto adiado.
Núcleo