在发电机功能中产生陈述行为



学习生成器我从MDN那里得到了这个示例:

function* fibonacci() {
  var fn1 = 0;
  var fn2 = 1;
  while (true) {  
    var current = fn1;
    fn1 = fn2;
    fn2 = current + fn1;
    var reset = yield current;
    if (reset) {
        fn1 = 0;
        fn2 = 1;
    }
  }
}
var sequence = fibonacci();
console.log(sequence.next().value);     // 0
console.log(sequence.next().value);     // 1
console.log(sequence.next().value);     // 1
console.log(sequence.next().value);     // 2
console.log(sequence.next().value);     // 3
console.log(sequence.next().value);     // 5
console.log(sequence.next().value);     // 8
console.log(sequence.next(true).value); // 0
console.log(sequence.next().value);     // 1
console.log(sequence.next().value);     // 1
console.log(sequence.next().value);     // 2

我很感谢一个精心编写的文字一起回答以下问题:
为什么在所有分配给它的yield current之后,reset伪造了falsy?这导致了一个更普遍的问题:yield在作业中的表现如何?
一个值究竟传递给 next()到哪里?因为此代码中的这里

function *createIterator() {
 let first = yield 1;
 let second = yield first + 2; // 4 + 2
 yield second + 3; // 5 + 3
}
let iterator = 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 }"   

现在,我将yield first + 2替换为yield (first + 2),并且仍然得到相同的结果。那么背后的机制是什么?

我是这种编程样式的新手,逐步详细的答案将是金色的。我为速度读者重复:请帮助我了解Javascipt如何通过指令执行此类代码指令,谢谢

分配了yields时,它有两个用途:

第一个是其主要用途:

它确定由迭代器的next()方法返回的每个对象。

第二个是分配时:

最棘手的部分是,首先在这里(作业的正确部分)执行收益的主要作用。然后发电机代码冻结。下次next()被称为恢复执行。首先将当前 next()参数分配给分配的左侧。

知道这一点:

每次调用发电机的下一个()方法,发电机 恢复执行并运行,直到达到以下一项:

收益率,这会导致发电机再次暂停并返回发电机的新值。下一个next()被调用, 产量后立即使用该声明恢复执行。 ...

这是第二个示例的执行方式:

iterator.next()--->>>
yields 1
//next returns 1 in the 'value' property
//Freezing until the next call to next
iterator.next(4)--->>>
let first =4
yield first + 2;
//next returns 6 in the 'value' property
//Freezing until the next call to next 
iterator.next(5)--->>>
let second = 5
yield second + 3;
// That is 8 in the value property

有用的链接:

  • https://developer.mozilla.org/en-us/docs/web/javascript/reference/reference/operators/yield
  • https://developer.mozilla.org/en-us/docs/web/javascript/guide/guide/guide/iterators_and_generators#advanced_generators
  • https://developer.mozilla.org/en-us/docs/web/javascript/Reference/global_objects/generator/next
  • 一些见解和第二个例子摘自Nicholas C. Zakas的书:了解Ecmascript 6

最新更新