当前位置: 首页 > Web前端 > JavaScript

JavaScript生成器函数详解(function-)

时间:2023-03-27 01:17:23 JavaScript

1.什么是生成器函数?用function*定义的函数称为生成器函数,返回值是一个Generator对象,不能直接使用,需要调用next()方法使用。1.语法//语法function*name([param[,param[,...param]]]){statements}2.简单示例//示例function*generator(i){returni+1;}constgen=发电机(10);console.log(gen.next());//Output:{value:11,done:true}3.不能作为构造函数*f(){}varobj=newf;//throws"TypeError:fisnotaconstructor"二、其他特点1、yieldyield关键字可以使生成器函数成为异步函数。yield的作用是暂停运行代码,直到下一次调用next()方法。function*generator(i){yieldi;yieldi+10;}constgen=generator(10);console.log(gen.next().value);//输出:10console.log(gen.next().value);//输出:202,yield*yield*表示移交代码执行权。函数*anotherGenerator(i){yieldi+1;产量i+2;yieldi+3;}function*generator(i){yieldi;yield*anotherGenerator(i);//移交执行yieldi+10;}vargen=generator(10);console.log(gen.next().value);//10console.log(gen.next().value);//11console.log(gen.next().value);//12console.log(gen.next().value);//13console.log(gen.next().value);//203.returnreturn表示不等待直接返回。函数*yieldAndReturn(){yield"Y";return"R";//显式return时,可以观察到done也立即变为trueyield"unreachable";//不会执行}vargen=yieldAndReturn()console.log(gen.next());//{值:“Y”,完成:false}console.log(gen.next());//{value:"R",done:true}console.log(gen.next());//{value:undefined,done:true}3.更多使用场景1.完全调用函数*idMaker(){varindex=0;while(index<3)yieldindex++;}vargen=idMaker();console.log(gen.next().value);//0console.log(gen.next().value);//1console.log(gen.next().value);//2console.log(gen.next().value);//undefined2,构造时传递参数//可以接受参数function*idMaker(){varindex=arguments[0]||0;while(true)yieldindex++;}vargen=idMaker(5);console.log(gen.next().value);//5console.log(gen.next().value);//63.运行时传参//传参function*createIterator(){letfirst=yield1;letsecond=yieldfirst+2;//4+2//first=4就是next(4)给前面赋参数yieldsecond+3;//5+3}letiterator=createIterator();console.log(iterator.next());//"{value:1,done:false}"console.log(iterator.next(4));//"{value:6,done:false}"console.log(iterator.next(5));//"{value:8,done:false}"console.log(iterator.next());//"{value:undefined,done:true}"4.遍历//二维数组变成一维数组arrayfunction*iterArr(arr){//迭代器返回一个迭代器对象if(Array.isArray(arr)){//内部节点for(leti=0;i