3

Правильно ли я понимаю, что в этом коде в 1-м варианте так как у стрелочных функций нету this она берет this у "родителя" , а во 2-м варианте this вообще нету поэтому будет ошибка?

const user = {
  name: 'Bob',
  city: ["Madrid", 'Rome', 'LA'],
  printLocation: function() {
    this.city.forEach(city => {
      console.log(`${this.name} live in ${city}`)
    })
  }
}

user.printLocation()

const user2 = { name: 'Bred', city: ["Madrid", 'Rome', 'LA'], printLocation: () => { this.city.forEach(city => { console.log(${this.name} live in ${city}) }) } }

user2.printLocation()

TS E
  • 103

2 Answers2

6

а во 2м варианте this вообще нету

this есть, но в данном случае ссылается он на объект window. В стрелочных функциях, this подхватывает значение лексического контекста. Если простым словами, то значение this внутри стрелочной функции, будет таким же, как и снаружи. Однако, в ES6 появились именно методы объекта и для более короткого синтаксиса, можете использовать их:

const user = {
  name: 'Bred',
  city: ["Madrid", 'Rome', 'LA'],
  printLocation() {
    this.city.forEach(city => {
      console.log(`${this.name} live in ${city}`);
    });
  }
};
user.printLocation();
Deonis
  • 34,025
  • То же самое что printLocation: function() – Roman C May 28 '18 at 09:52
  • @RomanC, не совсем то же, но по сути да - это можно считать сокращенным синтаксисом, о чем я и написал выше. – Deonis May 28 '18 at 10:21
1

const user = {
  name: 'Bob',
  city: ["Madrid", 'Rome', 'LA'],
  printLocation: function() {
    this.city.forEach(city => {
      console.log(`${this.name} live in ${city}`)
    })
  }
}

user.printLocation()

const user2 = { name: 'Bred', city: ["Madrid", 'Rome', 'LA'], printLocation: () => { user2.city.forEach(city => { console.log(${user2.name} live in ${city}) }); } }

user2.printLocation()

Roman C
  • 9,043
  • 4
  • 20
  • 28