如何在javascript中使用嵌套函数作为生成器(使用“内部”产生)

时间:2016-05-13 15:04:52

标签: javascript generator inner-classes yield-keyword

<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,假;然后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结构(作为内部函数),我怎样才能继续获得与第一个样本相同的结果?

2 个答案:

答案 0 :(得分:1)

d2生成器函数不会产生任何内容,也不会返回任何内容,因此您只能获得未定义。

您可能希望将其称为传递p参数,并使用yield*生成每个迭代值。

function * d2 (p) {
  yield* function * d1 (p) {
    p -= 1;
    yield p;
    p -= 2;
    yield p;
  }(p);
}

答案 1 :(得分:0)

复制和过去的需求:这是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>