
JavaScript 生成器是一种能**暂停和恢复执行**的特殊函数,它不是一次性跑完,而是按需“走一步、停一步”,适合处理需要分段产出数据或控制流程的场景。核心在于 function* 声明方式和 yield 关键字的配合。
生成器函数怎么定义和使用
必须用 function*(星号紧贴 function 或函数名都可)声明,调用时不会立即执行,而是返回一个生成器对象——这个对象本身就是一个迭代器。
- 生成器对象自带
next()方法,每次调用就推进到下一个yield或函数结束 - 每次
next()返回形如{ value: ..., done: true/false }的对象 - 所有
yield值都会被依次产出;return的值也会出现在value中,但done变为true
yield 是什么,它不是 return
yield 是生成器的“暂停开关”:它交出一个值,同时冻结当前函数的所有状态(变量、执行位置等),等待下一次 next() 唤醒。
- 它不终止函数,只暂停;而
return会立刻退出 -
yield后面的表达式是惰性求值的——只有调用next()时才计算 - 它可以接收外部传入的数据:
gen.next('hello')中的'hello'会成为上一个yield表达式的返回值,实现双向通信
生成器本质是可迭代对象
生成器对象自动实现了 Symbol.iterator 接口,因此能直接用于:
技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作
立即学习“Java免费学习笔记(深入)”;
-
for...of循环(但注意:return值不会被循环捕获) - 展开运算符:
[...myGenerator()] - 数组解构:
const [a, b] = myGenerator();
yield* 用于委托迭代
当一个生成器需要复用另一个生成器或遍历数组/字符串等可迭代对象时,用 yield* 更简洁:
-
yield* anotherGenerator()直接把控制权交给对方,逐个产出它的yield值 -
yield* [1, 2, 3]等价于手动写三个yield,适合扁平化嵌套结构










