Стрелочная функция это просто синтаксический сахар для привязки контекста выполнения функции.
Давайте по порядку. До ES2015 писали вот так:
function getFIO(name, surname, patronymic) {
this.name = name,
this.surname = surname,
this.patronymic = patronymic,
this.sayHello = function() {
console.log(`Меня зовут ${this.surname} ${this.name} ${this.patronymic}`);
}
}
var getFio = new getFIO('Юрий', 'Горячев', 'Александрович');
getFio.sayHello();
И все прекрасно работало до тех пор пока мы не начинали вызывать функцию `sayHello()` с другим контекстом. Например:
var getFio = new getFIO('Юрий', 'Горячев', 'Александрович');
var sayHello = getFio.sayHello;
sayHello() // в this теперь не объект getFio, а undefined
// или
someElement.addEventListener('click', getFio.sayHello, true) // контекст опять потерялся
Чтобы это исправить в конструкторе класса явно сохраняли контекст и передавали в функцию через замыкание:
function getFIO(name, surname, patronymic) {
var that = this // сохранили контекст в локальной переменной
this.name = name,
this.surname = surname,
this.patronymic = patronymic,
this.sayHello = function() {
console.log(`Меня зовут ${that.surname} ${that.name} ${that.patronymic}`); // теперь как бы ни вызвали эту функцию она всегда будет брать контекст из замыкания
}
}
// или
function getFIO(name, surname, patronymic) {
var sayHello = function() {
console.log(`Меня зовут ${this.surname} ${this.name} ${this.patronymic}`);
}
this.name = name,
this.surname = surname,
this.patronymic = patronymic,
this.sayHello = sayHello.bind(this) // явно указываем контекст выполнения функции
}
Чтобы избавится от этих проблем ввели стрелочные функции которые сохраняют контекст в котором они были объявлены.