2016-03-30 28 views
1

Ben this article about javascript generators okuyordu ve ben şu pasajı ulaştı:Bu yineleyici aşağıdaki değerleri neden veriyor?

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 } 

İlk it.next() amacını anlamıyorum. Bunu gerçekleştirdikten sonra, bu satır, yineleyici var z = yield (y/3)'da duraklatılmalı, y değeri 6 değerine sahip olmalıdır? it.next(12), yield (y/3) için param sağlamaz ve bundan sonra 4 olabilir mi? Fonksiyonun neden 5 + 12 + 4 olmadığını anlamıyorum. Her nasılsa ilk it.next() göz ardı ediliyormuş gibi. Bu dava mı? Birisi biraz ışık tutabilir mi?

cevap

1

Sen neler olduğunu görmek için bazı günlük ifadeleri eklemek isteyebilirsiniz: foo(5) arayarak

it {next: …} 
starting 
{ value:6, done:false } 
y 24 
{ value:8, done:false } 
z 13 
{ value:42, done:true } 

Gördüğünüz gibi

function *foo(x) { 
    console.log("starting"); 
    var y = 2 * (yield (x + 1)); 
    console.log("y", y); 
    var z = yield (y/3); 
    console.log("z", z); 
    return (x + y + z); 
} 

var it = foo(5); 
console.log("it", it); 
console.log(it.next()); 
console.log(it.next(12)); 
console.log(it.next(13)); 

günlükleri, sadece jeneratör nesnesi yaratır ama değil henüz başla. Sadece it.next() numaralı ilk arama, bunu ilk yield'dan döndürerek gerçekleştirir. Bu ilk çağrı herhangi bir argüman almaz, çünkü gene de gene jeneratör fonksiyonunun içinde erişilebilir değildir.

.next(12) Sadece ikinci çağrı, burada değer geçen o geçirilen değeri (daha sonra 2 ile çarpılır) yield ekspresyon sonucu olmak üzere jeneratör kodu devam edecektir.

+0

bunu doğru anladınız mı yardımcı olabilir? Temel olarak, ilk 'it.next()' i çağırdıktan sonra, arayan kişiye 6 döndürülür ve düğüm aynı işlevi elde etmek için işlevi askıya alır mı? Bu yüzden, '' x (x) yerine 12, x + 1 yerine 'it.next (12) 'yi çağırırken, doğru mu? – Geo

+0

@Geo: Tam olarak nasıl 'verim' çalışıyor, evet :-) Çoğu durumda (yineleyiciler gibi), iletilen değerler hakkında hiçbir şey umursamıyorsunuz (veya hiçbir değer iletilmiyor), ancak Bununla bazı süslü şeyler. Sorunuza bağladığınız makale dizisini okumaya devam edin! – Bergi

2

Bu

function *foo(x) { 
    var y = 2 * (yield (x + 1)); 
     // x = 5 (from foo(5)) so it yields 6 
     // next(12) => var y = 2 * (12) == 24 
    var z = yield (y/3); 
     // from above y = 24 so yields 8 
     // next(13) => var z = 13  
    return (x + y + z); 
     // 5 + 24 + 13 == 42 (and done: true) 
} 
İlgili konular