Один и тот же
код написан для обычной функции и для стрелочной:
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?