如何在 javascript 中使用嵌套函数作为生成器(使用 "inner" 产量)
How to use nested functions as generator in javascript (using "inner" yields)
<script>
function * d1 (p) {
p-=1;
yield p;
p-=2;
yield p;
}
var g=d1 (9);
var h;
console.log((h=g.next()).value+','+h.done+';');
console.log((h=g.next()).value+','+h.done+';');
console.log((h=g.next()).value+','+h.done+';');
</script>
给出 8,false;然后6,假;然后是未定义的,真实的;
而
<script>
function * d2 (p) {
function * d1 (p) {
p -=1 ;
yield p;
p -=2 ;
yield p;
}
d1(p);
}
var g=d2 (9);
var h;
console.log((h=g.next()).value+','+h.done+';');
console.log((h=g.next()).value+','+h.done+';');
console.log((h=g.next()).value+','+h.done+';');
</script>
给我三次 undefined,true;
因为我想要 d1 的隐藏结构(作为内部函数),我怎样才能继续得到与第一个样本相同的结果?
d2
生成器函数既不产生也不 return 任何东西,所以你只会得到 undefined。
您可能想调用它传递 p
参数,并使用 yield*
产生每个迭代值。
function * d2 (p) {
yield* function * d1 (p) {
p -= 1;
yield p;
p -= 2;
yield p;
}(p);
}
对于复制和粘贴需求:这是 Oriol 为我工作的解决方案
<script>
function * d2 (p) {
function * d1 (p) {
p -=1 ;
yield p;
p -=2 ;
yield p; }
yield * d1(p); }
// ^^^^^^^^ are the changes
var g=d2 (9);
var h;
console.log((h=g.next()).value+','+h.done+';');
console.log((h=g.next()).value+','+h.done+';');
console.log((h=g.next()).value+','+h.done+';');
</script>
<script>
function * d1 (p) {
p-=1;
yield p;
p-=2;
yield p;
}
var g=d1 (9);
var h;
console.log((h=g.next()).value+','+h.done+';');
console.log((h=g.next()).value+','+h.done+';');
console.log((h=g.next()).value+','+h.done+';');
</script>
给出 8,false;然后6,假;然后是未定义的,真实的; 而
<script>
function * d2 (p) {
function * d1 (p) {
p -=1 ;
yield p;
p -=2 ;
yield p;
}
d1(p);
}
var g=d2 (9);
var h;
console.log((h=g.next()).value+','+h.done+';');
console.log((h=g.next()).value+','+h.done+';');
console.log((h=g.next()).value+','+h.done+';');
</script>
给我三次 undefined,true;
因为我想要 d1 的隐藏结构(作为内部函数),我怎样才能继续得到与第一个样本相同的结果?
d2
生成器函数既不产生也不 return 任何东西,所以你只会得到 undefined。
您可能想调用它传递 p
参数,并使用 yield*
产生每个迭代值。
function * d2 (p) {
yield* function * d1 (p) {
p -= 1;
yield p;
p -= 2;
yield p;
}(p);
}
对于复制和粘贴需求:这是 Oriol 为我工作的解决方案
<script>
function * d2 (p) {
function * d1 (p) {
p -=1 ;
yield p;
p -=2 ;
yield p; }
yield * d1(p); }
// ^^^^^^^^ are the changes
var g=d2 (9);
var h;
console.log((h=g.next()).value+','+h.done+';');
console.log((h=g.next()).value+','+h.done+';');
console.log((h=g.next()).value+','+h.done+';');
</script>