第七章 迭代器与生成器
7.3 生成器
乍一看理解,仔细想没理解,然后自己让n=2,还原nTimes,等价于
function* nTimes() {
if (true) {
yield* (function* A() {
if (true) {
yield* (function* B() { })();
yield 0;
}
})();
yield 1;
}
}
最难理解的是n=0的时候
yield* (function* B() { })();
yield*后面必须跟一个可迭代对象,*号函数正好返回一个可迭代对象,但是当这个可迭代对象没有可以迭代的操作(也就是内部没有yield表达式)时候,会被忽略(yield* (function* B() { })(); 被当成一个同步代码在执行),所以应该执行yield 0;
let aa = nTimes();
console.log(aa.next());
console.log(aa.next());
所以第一次打印出{ value: 0, done: false }。
也就是
(function* A() {
if (true) {
yield* (function* B() { })();
yield 0;
}
})()
执行完毕。
所以第二次执行的时候就相当于在执行yield 1;,所以打印出来就是{ value: 1, done: false }。
所以yield* nTimes(3 - 1) 等价于
yield* [yield 2 - 1, yield 1 - 1];
nTimes(3) 等价于nTimes3()
function* nTimes(n) {
if (n > 0) {
yield* nTimes(n - 1);
yield n - 1;
}
}
function* nTimes3() {
yield* [yield 2 - 1, yield 1 - 1];
yield 2 - 1;
}
//TODO持续更新