学习生成器我从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