ES6 Стрелочные функции

Стрелочные функции упрощают запись обычных функций, делая код компактнее.

Пример

Ранее использовалось:


hello = function() {
  return "Hello World!";
};

Пример

Теперь со стрелочной функцией:


hello = () => {
  return "Hello World!";
};

А если тело функции состоит всего лишь из одного выражения, возвращающего результат, то фигурные скобки и оператор return можно опустить:

Пример

Получается ещё лаконичнее:


hello = () => "Hello World!";

Примечание: Стрелочные функции работают именно таким образом лишь тогда, когда содержат всего одно действие.

При наличии аргументов их передают через круглые скобки.

Пример

Стрелочная функция с аргументами:


hello = (val) => "Hello " + val;

Однако, если аргумент единственный, круглых скобок можно избежать.

Пример

Стрелочная функция без скобок вокруг аргумента:


hello = val => "Hello " + val;


А как обстоят дела с this?

Использование this в стрелочных функциях кардинально отличается от классических функций JavaScript.

Кратко говоря, стрелочные функции не имеют собственной привязки к контексту (this).

В традиционных функциях значение this указывало на объект, вызвавший функцию — будь то окно браузера, документ HTML, кнопка или другой элемент.

А вот в стрелочной функции значение this всегда соответствует объекту, в контексте которого была объявлена сама стрелочная функция.

Для наглядности давайте сравним два варианта вызова метода: сначала автоматически после загрузки страницы, а второй раз вручную, нажатием кнопки пользователем.

Первый вариант демонстрирует использование традиционной функции, тогда как во втором варианте применяется стрелочная функция.

Результаты показывают, что первая версия выводит разные объекты (window и button), поскольку значение this зависит от контекста вызова. Во втором примере стрелочная функция сохраняет привязку к исходному объекту Header, вследствие чего выводится один и тот же объект Header.

Пример 1:

Обычная функция наследует контекст вызывающего объекта через this:


class Header {
  constructor() {
    this.color = "Red";
  }

  // Традиционная функция:
  changeColor = function() {
    document.getElementById("demo").innerHTML += this;
  }
}

const myheader = new Header();

// Функция вызвана объектом window:
window.addEventListener("load", myheader.changeColor);

// Функция вызвана кнопкой:
document.getElementById("btn").addEventListener("click", myheader.changeColor);

Пример 2:

Стрелочная функция сохраняет ссылку на оригинальный объект Header, вне зависимости от того, кем она была вызвана:


class Header {
  constructor() {
    this.color = "Red";
  }

  // Стрелочная функция:
  changeColor = () => {
    document.getElementById("demo").innerHTML += this;
  }
}

const myheader = new Header();

// Вызывается объектом window:
window.addEventListener("load", myheader.changeColor);

// Вызывается кнопкой:
document.getElementById("btn").addEventListener("click", myheader.changeColor);

Важно учитывать эти различия при работе с JavaScript-функциями. В некоторых случаях полезно использовать традиционную функцию, в других ситуациях лучше подойдет стрелочная функция.