es6 generator 消失的第一个next value 之谜

新手上路,请多包涵

最近在看generator,我们知道iterator里面的iter.next(value) 是generator() 下一个yield的里面的返回值 和yield expression, expression 本身的返回值没有关系,如下。

function test2() {
    function* gen2(arg){
        console.log("gen2 arg:" + arg);

        var a = yield 1;
        console.log("a:" + a);

        var b = yield 2;
        console.log("b:" + b);

        return 'finished';
    }

    var iter = gen2(6);

    iter.next(7); // { value:1, done:false }
    iter.next(8); // { value:2, done:false }
    iter.next(9); // { value:'finished', done:true }
}

test2(); 结果如下

gen2 arg:6
a:8
b:9

问题是第一个iter.next(7); 当中的7传给谁了?跑到哪里去了,怎样才能在generator当中获得? 这样设计的目的是啥?

阅读 4.1k
4 个回答

7应该是取不到,next参数会被当作上一个yield语句的返回值,然而在传7的时候没有上一个返回值,传8的时候上一个返回值是a,so,第一个next传参是没意义的。

第一个next()不可以传参数,仅作为启动目的,

next 的参数用来指定上一个yield 语句的返回值(yield 默认返回 undefined)。
当执行next的时候代码运行到yield语句后暂停,所以当你调用next(7) 的时候 执行呢 var a = yield 1; 后暂停到呢 console.log("a:" + a); 当你调用next(8) 的时候你指定呢上一次yield 语句的返回值为8 所以这里a等于8,继续从console.log("a:" + a);这段执行所以打印的是8,没有打印7,因为第一个next 前面是不可能有 yield 语句的所以7 是没有的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题