Как правильно передать окружение в стрелочную функцию с фигурными скобками?

J

Пользователь

от JFC , в категории: Другие , год назад

Без фигурных скобок вокруг выражения стрелочной функции, material доступен внутри функции

1
2
3
4
5
const materials = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium'];

console.log(materials.map((material) => material.length));
// Expected output: Array [8, 6, 7, 9]
// Real: Array [8, 6, 7, 9]

Если же выражение завернуть в скобки то нет

1
2
3
4
5
const materials = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium'];

console.log(materials.map((material) => { material.length }));
// Expected output: Array [8, 6, 7, 9]
// Real: Array [undefined, undefined, undefined, undefined]
Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от patrick.little , год назад

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


  • Без фигурных скобок:
1
console.log(materials.map((material) => material.length));


В этом случае, если тело стрелочной функции представляет собой только одно выражение, оно будет возвращено автоматически. В данном случае, .map() вызывает функцию для каждого элемента массива materials, и возвращаемое значение будет длина каждого элемента массива.


  • С фигурными скобками:
1
console.log(materials.map((material) => { material.length }));


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


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

1
console.log(materials.map((material) => { return material.length; }));


Или даже более кратко:

1
console.log(materials.map(material => material.length));


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