Resumo : neste tutorial você aprenderá quando não deve usar as funções de seta no ES6.
Uma função de seta não possui seu próprio this
valor e arguments
objeto. Portanto, você não deve usá-lo como um manipulador de eventos, um método de um objeto literal, um método de protótipo ou quando tiver uma função que usa o arguments
objeto.
1) Manipuladores de eventos
Suponha que você tenha o seguinte campo de texto de entrada:
<input type="text" name="username" id="username" placeholder="Enter a username">
Linguagem de código: HTML, XML ( xml )
E você deseja mostrar uma mensagem de saudação quando os usuários digitam seus nomes de usuário. A seguir mostra o <div>
elemento que exibirá a mensagem de saudação:
<div id="greeting"></div>
Linguagem de código: HTML, XML ( xml )
Depois que os usuários digitam seus nomes de usuário, você captura o valor atual da entrada e o atualiza no <div>
elemento:
const greeting = document.querySelector('#greeting');
const username = document.querySelector('#username');
username.addEventListener('keyup', () => {
greeting.textContent = 'Hello ' + this.value;
});
Linguagem de código: JavaScript ( javascript )
No entanto, ao executar o código, você receberá a seguinte mensagem, independentemente do que digitar:
Hello undefined
Linguagem de código: JavaScript ( javascript )
Isso significa que o this.value
manipulador de eventos sempre retorna undefined
.
Conforme mencionado anteriormente, a função de seta não possui this
valor próprio. Ele usa o this
valor do escopo lexical envolvente. No exemplo acima, a this
função de seta faz referência ao objeto global.
No navegador da web, o objeto global é window
. O window
objeto não possui a value
propriedade. Portanto, o mecanismo JavaScript adiciona a propriedade value ao window
objeto e define seus valores como undefined
.
Para corrigir esse problema, você precisa usar uma função regular. O this
valor estará vinculado ao <input>
elemento que aciona o evento.
username.addEventListener('keyup', function () {
input.textContent = 'Hello ' + this.value;
});
Linguagem de código: JavaScript ( javascript )
2) Métodos de objeto
Veja o seguinte counter
objeto:
const counter = {
count: 0,
next: () => ++this.count,
current: () => this.count
};
Linguagem de código: JavaScript ( javascript )
O counter
objeto possui dois métodos: current()
e next()
. O current()
método retorna o valor do contador atual e o next()
método retorna o próximo valor do contador.
O seguinte mostra o próximo valor do contador que deve ser 1:
console.log(counter.next());
Linguagem de código: CSS ( css )
Porém, ele retorna NaN
.
A razão é que quando você usa a função de seta dentro do objeto, ela herda o this
valor do escopo léxico envolvente, que é o escopo global neste exemplo.
O this.count
interior do next()
método é equivalente ao window.count
(no navegador).
O window.count
é undefined
por padrão porque o window
objeto não possui a count
propriedade. O next()
método adiciona um ao undefined
que resulta em NaN
.
Para corrigir isso, você usa funções regulares como método de um objeto literal da seguinte maneira:
const counter = {
count: 0,
next() {
return ++this.count;
},
current() {
return this.count;
}
};
Linguagem de código: JavaScript ( javascript )
Agora, chamar o next()
método retornará um conforme esperado:
console.log(counter.next()); // 1
Linguagem de código: JavaScript ( javascript )
3) Métodos de protótipo
Veja o seguinte Counter
objeto que utiliza o prototype
padrão:
function Counter() {
this.count = 0;
}
Counter.prototype.next = () => {
return this.count;
};
Counter.prototype.current = () => {
return ++this.next;
}
Linguagem de código: JavaScript ( javascript )
O this
valor nestes métodos next()
e current()
faz referência ao objeto global. Como você deseja que o this
valor dentro dos métodos faça referência ao Counter
objeto, você precisa usar as funções regulares:
function Counter() {
this.count = 0;
}
Counter.prototype.next = function () {
return this.count;
};
Counter.prototype.current = function () {
return ++this.next;
}
Linguagem de código: JavaScript ( javascript )
4) Funções que usam o objeto de argumentos
As funções de seta não possuem o arguments
objeto. Portanto, se você tiver uma função que usa arguments
objeto, não poderá usar a função de seta.
Por exemplo, a seguinte concat()
função não funcionará:
const concat = (separator) => {
let args = Array.prototype.slice.call(arguments, 1);
return args.join(separator);
}
Linguagem de código: JavaScript ( javascript )
Em vez disso, você usa uma função regular como esta:
function concat(separator) {
let args = Array.prototype.slice.call(arguments, 1);
return args.join(separator);
}
Linguagem de código: JavaScript ( javascript )
Resumo
- Uma função de seta não possui
this
valor próprio. Em vez disso, ele usa othis
valor do escopo lexical envolvente. Uma função de seta também não possui oarguments
objeto. - Evite usar a função de seta para manipuladores de eventos, métodos de objeto, métodos de protótipo e funções que usam o
arguments
objeto.