生成器函数具有next()调用

时间:2015-02-26 13:29:46

标签: javascript ecmascript-6

我从ecmascript 6 - 生成器函数看了一下新的未来,我对.next()函数的作用感到有点困惑。

在他们所说的官方文档中,我引用:A zero arguments function that returns an object with two properties:,根据websiteFeb 17, 2015 4:57:46 PM此处提供的文档链接)<-更新了相关信息。 p>

所以,假设我们有这个生成器函数:

 function* first(){
    yield 1;
    yield 2;
 }
 var f= first();

致电f.next()时会返回{value:1, done:false}。再次致电时,将返回{value:2, done:true}

但是,如果我们有这样的事情:

function* second() {
  var a = yield "HELLO";
  console.log("a = ", a);

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

  return b
}
var f= second();

当您这样称呼时:f.next()您将收到{value: "HELLO", done: false}

下一个电话会是f.next(1),它会将1分配给a,然后输出{value: 2, done: false}

下一个电话会是f.next(1),会输出{value: 1, done: true}

问题

  1. 如果在官方文件中声明它是零参数函数,你怎么可能用参数调用.next()
  2. 为什么在第3个结果中value属性等于1而在第二次调用时它等于2?
  3. 为什么b是1而不是2?
  4. 谢谢!

    PS: Of course, there's another usage of generator functions ( to avoid callbacks ), but I'm asking about this particular case. 
    

2 个答案:

答案 0 :(得分:2)

  
      
  1. 如果在官方文件中声明它是零参数函数,你可以用参数调用.next()吗?
  2.   

引用draft version of ES-6

  

参数可以传递给next函数,但它们的解释和有效性取决于目标迭代器。 for-of语句和迭代器的其他常见用户不通过任何参数,所以期望以这种方式使用的Iterator对象必须准备好处理没有参数的调用。

因此,将参数传递给next并不违反ES6规范。在这种情况下,传递给next的值将分配给您为yield表达式指定的变量。

  
      
  1. 为什么第3个结果的value属性等于1,第二次调用它等于2?
  2.   
  3. 为什么b是1而不是2?
  4.   

订单中的操作列表

  1. <强> f.next()

    yield "HELLO"
    

    所以你得到{ value: 'HELLO', done: false }

  2. <强> f.next(1)

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

    这就是您在此次通话中获得{ value: 2, done: false }的原因。

  3. <强> f.next(1)

    var b = 1;
    console.log("b = ", b);
    return b
    

    这就是你在这里获得{ value: 1, done: true }的原因。

答案 1 :(得分:1)

使用其他值,它变得更加清晰。它按预期工作。

function* second() {
  var a = yield "HELLO";

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

  console.log("b = ", b);
  return b
}
var f= second();

console.log('1:',f.next());
console.log('2:',f.next(5));
console.log('3:',f.next(7));

输出

///1st next()
//yeld returns iterator
{value: "HELLO", done: false}

//2nd next(5)
//the console log gets executed with var a = 5
a = 5
//yeld returns iterator
{value: 6, done: false}

//3rd next(7)
//the console log gets executed with var b = 7
b = 7
//it doesn't use the 'a' var at all, neither does it add +1 to the yeld allocation
//yeld returns iterator
{value: 7, done: true}