В чем разница контекста this в стрелочной и декларативной функции в JavaScript?
Что проверяют
Понимаете ли вы, что у стрелки нет своего this, и знаете ли следствия: bind не работает, методом объекта её писать нельзя.
Как отвечать
У обычной функции this определяется в момент вызова: через объект (obj.method()), явно (call, apply, bind), через new или, если ничего из этого нет, undefined в строгом режиме.
У стрелочной функции своего this нет вовсе. Она берёт его лексически, из области, где была создана, и изменить это нельзя: call, apply и bind на this стрелки не влияют, а new с ней запрещён.
const user = {
name: "Аня",
hello() { console.log(this.name); }, // "Аня"
hi: () => console.log(this.name), // undefined: this из внешней области
};Отсюда практическое правило: методы объектов и классов пишут обычными функциями, а колбэки внутри них стрелками, потому что стрелка сохранит this окружающего метода.
class Timer {
start() { setInterval(() => this.tick(), 1000); } // стрелка сохраняет this
}Ещё отличия стрелки: нет arguments (вместо него остаточные параметры), нет prototype, нельзя использовать как конструктор и как генератор.
Где спотыкаются
Пишут метод объекта стрелкой и теряют доступ к его данным.
Пытаются исправить this стрелки через bind.
Считают стрелку просто коротким синтаксисом.
Ищут arguments внутри стрелки и получают значение из внешней функции.