@zlodiak

Откуда берёт this стрелочная функция?

Один и тот же код написан для обычной функции и для стрелочной:

const cat = {
	lives: 9,
  jumps: () => {
  	console.log('what?!', this)
  	this.lives--;
  }
};
console.log('cat before', cat.lives);
cat.jumps();
console.log('cat after', cat.lives);

const dog = {
	lives: 9,
  jumps: function() {
  	this.lives--;
  }
};
console.log('dog before', dog.lives);
dog.jumps();
console.log('dog after', dog.lives);


Как видите, кошка после прыжка не теряет жизнь, а собачка теряет. С собачкой всё понятно - при вызове метода перед точкой указывается контекст:
dog.jumps();
Поэтому this внутри функции указывает на контекст. Поэтому есть метод jumps() может получить доступ к свойству lives.

Но с кошкой ситуация не понятна. Помогите пожалуйста разобраться. Я понимаю происходящее так:
1. вызывается метод тоже с указанием контекста перед точкой:
cat.jumps();
2. но так как функция стрелочная, то контекст cat игнорируется(другими словами стрелочная функция не связывает свой this с контекстом cat)
3. при этом console.log('what?!', this) почему-то выводит в консоль значение window
4. мне не понятно почему именно window.
5. я правильно предполагаю, что раз вызов cat.jumps(); происходит ИЗ глобального объекта, то cat заменяется на window?
  • Вопрос задан
  • 551 просмотр
Решения вопроса 1
Robur
@Robur
Знаю больше чем это необходимо
по простому:
this в стрелочной функции будет равен тому же чему равен был this в том месте где ее определили.

const x= this
setTimeout(() => console.log(this === x))  //true


class X {
  f() {
    const x=this
    setTimeout(() => console.log(x===this)) //true
   }
}

x=this
const obj = {
    y: ()=> console.log(x===this) //true
}


Ну и так далее.
Если вам не понятно что будет в x в таких примерах - читайте что такое this и как он работает, безотносительно к стрелочным функциям
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@shsv382
В стрелочной функции this будет lexical scoped (не знаю, как точно это перевести, но по смыслу - где определили, оттуда и this)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы