生成器函数详解

生成器函数详解



生成器函数即形如

function* 函数名(){}

的函数,他的功能也像他的名字一样,用于生成某些特定计划好的字符
如常用工具或者人名列表,或者如下图的ID

function* putout_id(){
    let ID=1;
    while(ID)
    {
        yield ID++;
    }
}
const lie=putout_id();
const next1={ID:lie.next().value};
const next2={ID:lie.next().value};
console.log(next1.ID);
console.log(next2.ID);

乍一看上去好像是一个死循环,但由于生成器具有每执行一次便挂起(暂停)的特性
即lie.next().value执行后生成器函数会暂停,直到下一次lie.next().value

因此除非你不停的调用他,不然他会在执行后挂起,而后我们使用它自带的next()方法来对生成器进行迭代,并用value取出他的返回值。

结果如下:
 这样的好处就在于保证了生成的ID不会重复,且随要随取,就像叫号机一样。


同时要注意yield

yield是属于生成器函数的一个关键词,yield关键字就像return一样但他实际返回一个IteratorResult对象
它有两个属性,value和done。value属性是对yield表达式求值的结果,而done是false,表示生成器函数尚未完全完成。

当生成器函数遇到他时就会暂停,直到下一次next方法的调用

举个如下的例子

function* putout_id(){
    let ID=1;
    ++ID;
    ++ID;
    while(ID)
    {
        yield ID++;
    }
}
const lie=putout_id();
const next1={ID:lie.next().value};
const next2={ID:lie.next().value};
console.log(next1.ID);
console.log(next2.ID);

结果如下:

这个例子中我们仅在let下加入了两次使ID进行自加的动作,
但是很显然第一次执行的时候是执行到了第二次yield关键词才停止的,
前面的let ID=1;++ID;++ID;yield ID++(由于是先出后加故显示为3);都被执行了.

除此之外还有yield*需要注意

乍一看上去好似只比yield多了个星号,但他的作用就在于可以在生成器函数中嵌套生成器函数,并使其自动迭代.
具体函数如下

function* putout_id(){
let ID=1;
yield other();
while(ID)
{
yield ID++;
}
}
function* other() {
yield "a";
yield "b";
}
const lie=putout_id();
const next1={ID:lie.next().value};
const next2={ID:lie.next().value};
console.log(next1.ID);
console.log(next2.ID);

此为未加星号版,结果如下: 很显然,未加星号的无法自动迭代,输出为一个名为other生成器函数对象。


我们再来看加入星号版的结果 输出结果为a和b如我们所想的迭代的结果

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值