You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Generator函数声明:function*与function *name的区别是什么?

生成器函数的两种声明写法:function* 和 function *name 有什么区别?

这两种写法没有任何功能上的差异,只是代码风格偏好不同而已——它们都是合法的生成器函数声明语法,运行时的行为完全一致。

JavaScript/TypeScript 的语法允许星号(*)和 function 关键字之间存在空格,也允许两者紧贴在一起。不管你写function* range(...)还是function *tossCoins(...),最终定义的都是生成器函数,逻辑执行、返回的生成器对象特性没有任何区别。

举你提到的两个例子:
Lit 中的range函数采用了星号紧贴function的写法:

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则用了function和星号之间加空格的写法:

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));
  }
}

这两种写法都能正常工作,不会对函数功能产生影响。

这种语法灵活性是语言设计时特意保留的,不同的团队或代码规范(比如 Airbnb、Google 的规范)可能会倾向于其中一种风格,核心目的是保持项目内的代码格式一致。比如有些规范认为星号是生成器函数类型的一部分,所以要求紧贴function;另一些则觉得加空格后语法更接近普通函数,可读性更好。

内容的提问来源于stack exchange,提问作者Ole

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 07:22:47