0
<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; が 3 回表示されます。

d1 の隠し構造 (内部関数として) が必要なので、最初のサンプルと同じ結果を得るにはどうすればよいですか?

4

2 に答える 2

1

ジェネレーター関数は何も生成せず、d2何も返さないため、未定義になるだけです。

pおそらく、引数を渡して呼び出し、反復された各値を で生成したいと思うでしょうyield*

function * d2 (p) {
  yield* function * d1 (p) {
    p -= 1;
    yield p;
    p -= 2;
    yield p;
  }(p);
}
于 2016-05-13T15:07:53.817 に答える
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>
于 2016-05-13T16:34:48.707 に答える