Стрелочные функции не предназначены для использования в каждой ситуации просто как сокращенная версия устаревших функций. Они не предназначены для замены синтаксиса функции с использованием 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
in getOwner
, чего нет, или если вы копируете getOwner
в другой объект.)
В списке рассылки es6 велись споры об изменении стрелочных функций, которые имеют похожий синтаксис, но со своим собственным this
. Однако это предложение было плохо воспринято, потому что это просто синтаксический сахар, позволяющий сэкономить при вводе нескольких символов и не предоставляющий новых функциональных возможностей по сравнению с существующим синтаксисом функций. См. Тему несвязанные стрелочные функции .
this
другому. Он определяется лексической средой, в которой была создана функция, что означает, чтоthis
значение, в котором вы создаетеchopper
переменную, будетthis
значением функции. Другими словами, он не будет ссылаться наchopper
объект.