2014-11-21 42 views
1

我想了解這是如何工作。我已經操縱了這些代碼,但仍不明白它是如何返回值的。我在http://davidwalsh.name/es6-generatorsES6發電機讓我困惑

function *foo(x) { 
    var y = 2 * (yield (x + 1)); 
    var z = yield (y/3); 
    return (x + y + z); 
} 

var it = foo(5); 

// note: not sending anything into `next()` here 
console.log(it.next());  // { value:6, done:false } 
console.log(it.next(12)); // { value:8, done:false } 
console.log(it.next(13)); // { value:42, done:true } 

得到這個從教程中,我似乎對第一next()的把握有點的,但未來2擋板我的8值和42

希望有人可以幫助解釋這一點,所以我可以嘗試掌握並使用發電機進入下一個階段。

+0

好像你至少第二個人通過這個特殊的教程中百思不得其解。也許是時候去找一個不同的了。 – 2014-11-21 07:03:58

+0

是的,這是重複的,但我仍然認爲其他問題完全沒有答案。兩個答案都說第一個值是6,但是yield本身的實際初始值是5.我認爲必須理解執行上下文在yield暫停之前和當它彈出執行上下文並返回時的區別評估。這是不正確的? – pertrai1 2014-11-22 08:04:04

+0

我不明白你的評論的任何部分。 「收益本身的實際初始值是5」是什麼意思? – 2014-11-22 08:21:41

回答

2

next的參數成爲之前yield的值。這是流程:

it.next()啓動發生器。其數值爲x + 1,即6

it.next(12)恢復發生器,返回12作爲值yield (x + 1)y變成2 * 12,即24it.next(12)的值產生爲24/3,即8

it.next(13)恢復發生器,返回13作爲yield (y/3)的價值,所以13被分配給z。最終的結果是5 + 24 + 1342

TL; DR:next恢復生成器並傳遞值yield返回。 yield停止發電機並傳遞值由next返回。這就像這個有趣的數字網球遊戲。

+0

真棒!在我坐在控制檯試圖弄清楚之後,非常感謝你的理解。 – pertrai1 2014-11-21 05:17:44

5

發電機不超過語法糖倒閉更多,試試這個:

function foo(x) 
    { 
    var step = 0; 
    var y; 
    var z; 

    function next(p) { 

     switch(step++) { 
     case 0: return { done:false, value:x + 1 }; break; 
     case 1: y = 2 * p; return { done:false, value:y/3 }; break; 
     case 2: z = p; return { done:true, value: x + y + z }; break; 
     default: return; 
     } 
    } 
    return {next:next}; 
    }  

    var it = foo(5); 
    console.log(it.next());  // { value:6, done:false } 
    console.log(it.next(12)); // { value:8, done:false } 
    console.log(it.next(13)); // { value:42, done:true } 
+0

啊!感謝您分享這一點。另一個例子幫助我解釋了這一點。非常感激。 – pertrai1 2014-11-21 06:21:51