В чем разница между функцией* и функцией *имя?

Иногда мы видим функции-генераторы, объявленные с помощью function*, а иногда мы видим их объявленными как function *nameOfFunction. В чем разница?

Например, функция range в Lit Element объявляется следующим образом:

 * @example
 *
 * ```ts
 * render() {
 *   return html`
 *     ${map(range(8), () => html`<div class = "cell"></div>`)}
 *   `;
 * }
 * ```
 */
export function range(end: number): Iterable<number>;
export function range(
  start: number,
  end: number,
  step?: number,
): Iterable<number>;
export function* range(startOrEnd: number, end?: number, step = 1) {
  const start = end === undefined ? 0 : startOrEnd;
  end ??= startOrEnd;
  for (let i = start; step > 0 ? i < end : end < i; i += step) {
    yield i;
  }
}

А функция tossCoins из документации объявлена ​​так:

async function *tossCoins(count: number) {
  for (let i=0; i<count; i++) {
    yield Math.random() > 0.5 ? 'Heads' : 'Tails';
    await new Promise((r) => setTimeout(r, 1000));
  }
}

предположительно вы используете функциональные выражения, поэтому одно из них является именованным функциональным выражением, а другое нет (т. е. оно анонимно).

Jaromanda X 17.06.2024 04:36

Никакой семантической разницы, только стиль. Аналогично String[] args и String args[] в Java.

Hao Wu 17.06.2024 04:40

Странно, вы не показали пример БЕЗ названия

Jaromanda X 17.06.2024 05:11

@HaoWu - ничего общего со стилем, поэтому ваш пример Java не имеет смысла в JavaScript

Jaromanda X 17.06.2024 05:12

@JaromandaX Я думаю, что OP имел в виду разницу между function* fn() (звездочкой после ключевого слова function) и function *fn() (звездочкой перед именем функции). Поскольку function* сам по себе является синтаксической ошибкой. Что касается Java, я только что проверил верхний языковой тег OP, чтобы привести пример, показывающий сходство.

Hao Wu 17.06.2024 05:15

@HaoWu const foo = function *() { ... }

Phil 17.06.2024 05:16

Возможный дубликат var functionName = function() {} vs function functionName() {} (пространство вокруг * не имеет значения), но действительно требует ясности от @Ole

Phil 17.06.2024 05:21
Since function* by itself is an syntax error придерживайтесь Java - но да, теперь я вижу, что пространство - это то, что сбивает с толку ОП
Jaromanda X 17.06.2024 05:21

Если речь идет только о пробелах, я думаю, что вопрос мог бы звучать просто: «Значен ли интервал вокруг * в объявлении функции генератора?». 10 секунд тестирования различных комбинаций также дали бы ответ на этот вопрос.

Phil 17.06.2024 05:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
9
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет никакой разницы, кроме стиля. Следующие три эквивалентны:

function* foo() { /* body */ }
function *foo() { /* body */ }
function * foo() { /* body */ }

На странице MDN, посвященной функциям генератора, показано function* вместе, за которым следуют пробелы, но также явно документировано, что между токенами можно добавлять пробелы.

Плагины ESLint , такие как generator-star-spacing, можно дополнительно использовать для поощрения или обеспечения согласованности в проекте. Его конфигурация по умолчанию не соответствует MDN ({"before": true, "after": false}, предпочтительнее function *foo()). Также могут быть доступны другие инструменты стиля и плагины/конфигурации IDE.

Забавный факт: вам даже не нужно место, чтобы это работало, но, пожалуйста, не надо.

Hao Wu 17.06.2024 05:19

Другие вопросы по теме