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
相关产品推荐
相关产品推荐

