Контекст в JS (this)

215
14 июня 2018, 00:10

Правильно ли я понимаю, что в этом коде в 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()

Answer 1

а во 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();

Answer 2

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()

READ ALSO
Vue router необязательный фрагмент

Vue router необязательный фрагмент

Имеется вот такой роут:

222
Почему не подключается rxjs6 из cdn?

Почему не подключается rxjs6 из cdn?

Подскажите пожалуйста почему этот простейший скрипт выводит ошибку:

186
Пересечение диапазонов

Пересечение диапазонов

Как определить пересечение графиков работы клиентов? Например, если первый клиент работает с 7 до 15, а второй с 6 до 10, то пересечением будет...

212
Как перевести дату в формат dd-mm-yyyy hh24:mi:ss?

Как перевести дату в формат dd-mm-yyyy hh24:mi:ss?

Как перевести дату 2018-05-27T16:45:00+03:00 в формат '27-05-2018 00:17:14', 'dd-mm-yyyy hh24:mi:ss'

207