As funções de seta no ES2015 fornecem uma sintaxe mais concisa.
- Posso substituir todas as minhas declarações / expressões de funções por funções de seta agora?
- O que eu tenho que procurar?
Exemplos:
Função construtora
function User(name) {
this.name = name;
}
// vs
const User = name => {
this.name = name;
};
Métodos de protótipo
User.prototype.getName = function() {
return this.name;
};
// vs
User.prototype.getName = () => this.name;
Métodos de objeto (literal)
const obj = {
getName: function() {
// ...
}
};
// vs
const obj = {
getName: () => {
// ...
}
};
Retornos de chamada
setTimeout(function() {
// ...
}, 500);
// vs
setTimeout(() => {
// ...
}, 500);
Funções variáveis
function sum() {
let args = [].slice.call(arguments);
// ...
}
// vs
const sum = (...args) => {
// ...
};
javascript
ecmascript-6
arrow-functions
Felix Kling
fonte
fonte
this
temtimesCalled
incrementos muito diferentes apenas em 1 cada vez que o botão é chamado. O que responde à minha pergunta pessoal:.click( () => { } )
e.click(function() { })
ambos criam o mesmo número de funções quando usadas em um loop, como você pode ver na contagem de Guid no Plnkr.Respostas:
tl; dr: Não! As funções de seta e as declarações / expressões de função não são equivalentes e não podem ser substituídas às cegas.
Se a função que deseja substituir se não usar
this
,arguments
e não é chamado comnew
, então sim.Como tantas vezes: depende . As funções de seta têm um comportamento diferente das declarações / expressões de função, então vamos dar uma olhada nas diferenças primeiro:
1. Lexical
this
earguments
As funções de seta não têm suas próprias
this
ouarguments
vinculativas. Em vez disso, esses identificadores são resolvidos no escopo lexical como qualquer outra variável. Isso significa que dentro de uma função de setathis
earguments
referir-se aos valoresthis
earguments
no ambiente em que a função de seta é definida (ou seja, "fora" da função de seta):No caso de expressão de função,
this
refere-se ao objeto que foi criado dentro docreateObject
. No caso função seta,this
refere-se athis
decreateObject
si.Isso torna as funções de seta úteis se você precisar acessar o
this
ambiente atual:Observe que isso também significa que não é possível definir uma função de seta
this
com.bind
ou.call
.Se você não conhece muito bem
this
, considere ler2. As funções de seta não podem ser chamadas com
new
O ES2015 distingue entre funções que são chamadas e funções que são construídas . Se uma função é construtível, pode ser chamada com
new
, ienew User()
. Se uma função puder ser chamada, ela poderá ser chamada semnew
(ou seja, chamada de função normal).Funções criadas através de declarações / expressões de função são construtíveis e chamadas.
As funções de seta (e métodos) só podem ser chamadas.
class
construtores são apenas construtíveis.Se você estiver tentando chamar uma função não exigível ou construir uma função não construtível, receberá um erro de tempo de execução.
Sabendo disso, podemos afirmar o seguinte.
Substituível:
this
ouarguments
..bind(this)
Não substituível:
this
)arguments
(veja abaixo))Vamos dar uma olhada mais de perto usando seus exemplos:
Função construtora
Isso não funcionará porque as funções de seta não podem ser chamadas com
new
. Continue usando uma declaração / expressão de função ou useclass
.Métodos de protótipo
Provavelmente não, porque os métodos de protótipo geralmente usam
this
para acessar a instância. Se eles não usaremthis
, você poderá substituí-lo. No entanto, se você se preocupa principalmente com a sintaxe concisa, useclass
com a sintaxe concisa do método:Métodos de objeto
Da mesma forma para métodos em um literal de objeto. Se o método quiser fazer referência ao próprio objeto via
this
, continue usando expressões de função ou use a nova sintaxe do método:Retornos de chamada
Depende. Você definitivamente deve substituí-lo se
this
estiver usando o alias externo ou estiver usando.bind(this)
:Mas: se o código que chama o retorno de chamada definir explicitamente
this
um valor específico, como geralmente ocorre com os manipuladores de eventos, especialmente com o jQuery, e o retorno de chamada usarthis
(ouarguments
), você não poderá usar uma função de seta!Funções variáveis
Como as funções de seta não têm suas próprias
arguments
, você não pode simplesmente substituí-las por uma função de seta. No entanto, o ES2015 apresenta uma alternativa ao usoarguments
: o parâmetro rest .Pergunta relacionada:
Mais recursos:
fonte
this
também afetasuper
e que não.prototype
.AssignmentExpression
) não pode ser inserida em todos os lugares em que uma expressão de função (PrimaryExpression
) pode e faz com que as pessoas sejam visitadas com bastante frequência (especialmente porque houve análise erros nas principais implementações de JS).() => {}()
) ou fazer algo assimx || () => {}
. É isso que eu quero dizer: erros de tempo de execução (análise). (E, mesmo sendo esse o caso, com bastante frequência as pessoas pensam que o erro está errado.) Você está apenas tentando cobrir erros de lógica que passariam despercebidos porque não necessariamente erram quando analisados ou executados?new
Qual é um erro de execução, certo?Espere, você não pode usar a função de seta em qualquer lugar do código, isso não funcionará em todos os casos, como
this
onde as funções de seta não são utilizáveis. Sem dúvida, a função de seta é um ótimo complemento, traz simplicidade de código.Mas você não pode usar uma função de seta quando um contexto dinâmico é necessário: definir métodos, criar objetos com construtores, obter o objetivo disso ao manipular eventos.
As funções de seta NÃO devem ser usadas porque:
Eles não tem
this
Ele usa o "escopo lexical" para descobrir qual
this
deve ser o valor de " ". No escopo lexical de palavras simples, ele usa “this
” de dentro do corpo da função.Eles não tem
arguments
As funções de seta não têm um
arguments
objeto. Mas a mesma funcionalidade pode ser alcançada usando os parâmetros de descanso.let sum = (...args) => args.reduce((x, y) => x + y, 0)
sum(3, 3, 1) // output - 7
`Eles não podem ser usados com
new
As funções de seta não podem ser construtoras porque não possuem uma propriedade prototype.
Quando usar a função de seta e quando não:
map
,reduce
ouforEach
.fonte
arguments
objeto especial que não está disponível nas funções de seta aqui: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Para usar as funções de seta
function.prototype.call
, criei uma função auxiliar no protótipo de objeto:uso
Editar
Você não precisa de um ajudante. Você poderia fazer:
fonte