Функції зі стрілками не призначені для використання у будь-якій ситуації лише як коротша версія старомодних функцій. Вони не призначені для заміни синтаксису функції за допомогою function
ключового слова. Найбільш поширеним варіантом використання функцій стрілок є такі короткі "лямбди", які не перевизначають this
, часто використовуються при передачі функції як зворотний виклик деякій функції.
Функції зі стрілками не можуть використовуватися для запису об'єктних методів, оскільки, як ви вже виявили, оскільки функції зі стрілками закриваються над this
контекстом, що охоплює лексику, this
внутрішня стрілка є тією, яка була поточною, де ви визначили об'єкт. Що означає:
var chopper = {
owner: 'Zed',
getOwner: () => {
return this.owner;
}
};
У вашому випадку, бажаючи написати метод на об'єкті, вам слід просто використовувати традиційний function
синтаксис або синтаксис методу, введений в ES6:
var chopper = {
owner: 'Zed',
getOwner: function() {
return this.owner;
}
};
var chopper = {
owner: 'Zed',
getOwner() {
return this.owner;
}
};
(Є невеликі відмінності між ними, але вони тільки важливо , якщо ви використовуєте super
в getOwner
, яких у вас немає, або якщо скопіювати getOwner
на інший об'єкт.)
У списку розсилки es6 було деяке обговорення щодо повороту на функціях стрілок, які мають подібний синтаксис, але зі своїм власним this
. Однак ця пропозиція була сприйнята погано, оскільки це лише синтаксис цукру, що дозволяє людям економити введення декількох символів і не надає нових функціональних можливостей щодо існуючого синтаксису функцій. Див. Розділ функції розв’язаних стрілок .
this
різному. Це визначається лексичним середовищем, в якому функція була створена, що означає, щоthis
значення, де ви створюєтеchopper
змінну, будеthis
значенням функції. Іншими словами, це не буде посилання наchopper
об’єкт.