javascript的生成器函数是什么?【教程】

生成器函数(function)调用后返回迭代器而不执行,需调用next()才开始运行并暂停于yield;yield可多次中断恢复、保留上下文,其表达式返回外部传入的值;适用于同步迭代,异步需async function配合for await…of。

javascript的生成器函数是什么?【教程】

function* 声明的函数就是生成器函数,它不是一次性返回全部结果,而是按需产出值,每次调用 next() 就执行到下一个 yield 并暂停。

这和普通函数有本质区别:普通函数一调用就跑完、返回一个值(或 undefined);生成器函数调用后返回一个迭代器对象,你得手动驱动它一步步走。

生成器函数调用后不执行,只返回迭代器

这是最容易误解的一点。写好 function* gen() { console.log('start'); yield 1; },然后执行 gen() —— 控制台什么都不会打。

因为:

立即学习Java免费学习笔记(深入)”;

魔法映像企业网站管理系统

魔法映像企业网站管理系统

技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作

下载

  • gen() 只创建并返回一个迭代器,不进入函数体
  • 真正开始执行,要第一次调用返回对象的 next()
function* gen() {
  console.log('start');
  yield 1;
  yield 2;
}

const it = gen(); // 没输出 it.next(); // 输出 'start',返回 { value: 1, done: false }

yield 不是 return,可以多次中断恢复

yield 会暂停执行,并把右侧表达式的值作为 value 返回;函数上下文(变量、执行位置)完整保留。下次 next() 时从中断处继续,不是重头来。

注意:yield 只能在生成器函数内部用,外层作用域写会报 SyntaxError: Unexpected strict mode reserved word

  • 不能在箭头函数里用 yield
  • 不能在普通 function 里用 yield
  • yield 表达式本身有返回值:外部传入 next(value)value 会成为本次 yield 表达式的计算结果
function* gen() {
  const x = yield 'first';
  console.log('x:', x); // x: 'from next'
  yield 'second';
}

const it = gen(); it.next(); // { value: 'first', done: false } it.next('from next'); // 输出 'x: from next',{ value: 'second', done: false }

生成器函数适合处理异步流程或大数据

它天然适配 for...ofArray.from()、展开运算符 [...gen()] 等可迭代协议场景,但要注意:如果生成器逻辑里有异步操作(比如 await),必须用 async function* —— 普通 function* 里不能直接 await,否则会当成字面量处理。

  • function* → 同步迭代,yield 是控制权让渡点
  • async function* → 异步迭代,支持 yield + await,返回的是 AsyncIterator
  • for await...of 才能消费 async function* 产生的迭代器
async function* asyncGen() {
  yield await Promise.resolve(1);
  yield await Promise.resolve(2);
}

for await (const x of asyncGen()) { console.log(x); // 1, 然后 2 }

生成器函数的核心价值不在“看起来高级”,而在于它把「执行控制权」从函数内部移交给了调用方。容易忽略的是:一旦生成器抛出未捕获错误,迭代器状态就变成 done: true,后续 next() 全部返回 { value: undefined, done: true } —— 这个静默终止行为,比想象中更难调试。

https://www.php.cn/faq/1996135.html

发表回复

Your email address will not be published. Required fields are marked *