Иногда мы видим функции-генераторы, объявленные с помощью 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));
}
}
Никакой семантической разницы, только стиль. Аналогично String[] args и String args[] в Java.
Странно, вы не показали пример БЕЗ названия
@HaoWu - ничего общего со стилем, поэтому ваш пример Java не имеет смысла в JavaScript
@JaromandaX Я думаю, что OP имел в виду разницу между function* fn() (звездочкой после ключевого слова function) и function *fn() (звездочкой перед именем функции). Поскольку function* сам по себе является синтаксической ошибкой. Что касается Java, я только что проверил верхний языковой тег OP, чтобы привести пример, показывающий сходство.
@HaoWu const foo = function *() { ... }
Возможный дубликат var functionName = function() {} vs function functionName() {} (пространство вокруг * не имеет значения), но действительно требует ясности от @Ole
Since function* by itself is an syntax error придерживайтесь Java - но да, теперь я вижу, что пространство - это то, что сбивает с толку ОП
Если речь идет только о пробелах, я думаю, что вопрос мог бы звучать просто: «Значен ли интервал вокруг * в объявлении функции генератора?». 10 секунд тестирования различных комбинаций также дали бы ответ на этот вопрос.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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