Стрелочные функции (лямбда-выражения)

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

<Переменная> = <Параметр> => <Возвращаемое значение>;
<Переменная> = ([<Параметр 1>[, …, <Параметр N>]]) => 
                <Возвращаемое значение>;
<Переменная> = ([<Параметр 1>[, …, <Параметр N>]]) => {
   <Тело функции>
   [return <Возвращаемое значение>;]
};

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

Пример стрелочной функции с одним параметром:

const func = n => n * 2;
console.log( func(5) ); // 10

Если тело функции состоит из одного выражения, то фигурные скобки можно не указывать. Результат вычисления этого выражения станет возвращаемым значением. Если указаны фигурные скобки, то для возврата значения нужно использовать конструкцию return. Предыдущий пример можно записать так:

const func = n => {
   return n * 2;
};
console.log( func(5) ); // 10

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

const func = (x, y) => x + y;
console.log( func(5, 7) ); // 12

Круглые скобки обязательно указываются при отсутствии параметров:

const func = () => console.log('Сообщение');
func(); // Сообщение

Если возвращаемым значением является объект внутри фигурных скобок, то его следует заключить в круглые скобки:

const func = () => ({ a: 1 });
console.log( func() ); // { a: 1 }

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

function test() {
   let x = 10, y = 5;
   return () => x + y;
}
let func = test();
console.log( func() ); // 15

В отличие от обычных функций внутри стрелочных функций нет доступа к объекту arguments. Чтобы передать неопределенное количество параметров нужно использовать оператор три точки перед именем параметра:

const sum = (...arr) => {
   let z = 0;
   for (let i = 0; i < arr.length; i++) {
      z += arr[i];
   }
   return z;
};
console.log( sum(5, 6, 7, 20) ); // 38

В отличие от анонимных функций стрелочные функции сохраняют ссылку на родительский указатель this:

function test() {
   console.log(this);                   // { a: 1 }
   let self = this;
   let func1 = function() {
      console.log(this);                // Object [global] {...}
      console.log(self);                // { a: 1 }
   };
   let func2 = () => console.log(this); // { a: 1 }
   func1();
   func2();
}
let obj = { a: 1 };
test.call(obj);

Причем указание контекста в методах call() и apply() не изменяет значение указателя this, т. к. стрелочные функции не содержат собственного указателя this. Они его лишь захватывают из родительской области видимости.

Учебник по Node.js и JavaScript
Учебник по JavaScript (Node.js) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов