js中发生器函数中yield语句到底是:返回后立即暂停 还是 暂停在下一次yield语句?

311 阅读1分钟

1. 前言介绍

如题所述,理解yield到底是返回后暂停,还是 返回后暂停在下一次yield语句。通过以下程序片段证明是: yield语句是:返回后立即暂停。

2. 验证程序

设计如下js片段:

  function *testYieldPausePoint(){
    for(let i=0;true;i++){
        console.log('___before___'+i+'__')
        let reset=yield i;
        console.log('___after___'+i+'___');
        if(reset){i=-1;}
    }
}

执行如图所示:

image.png

观察打印消息,容易得出是: yield返回并立即暂停, 在调用下一次next函数时候,在上一条yield语句的下一条语句作为起始位置继续执行。示意如图:

image.png

另外:

注意,由于next方法的参数表示上一个yield表达式的返回值,所以在第一次使用next方法时,传递参数是无效的。

所以才有 yIter.next(true) 影响了上一次的yield 设置 reset=true.影响到了本次的i=-1。

甚至可以这样讲 是停留在赋值=号处。

3. 执行结论

s中发生器函数中yield语句 是:返回后立即暂停