2017-09-08 16 views
2

同じ問題を解決する2つの方法の違いは何ですか?JavaScriptのジェネレータとクロージャの違いは何ですか?

閉鎖方法

const numberIncrementer = startValue =>() => startValue++ 
const getNextNumber = numberIncrementer(0) 

console.log(getNextNumber()) 
// 0 

console.log(getNextNumber()) 
// 1 

console.log(getNextNumber()) 
// 2 

発電方法

const numberIncrementer = function*(startValue) { 
    while(true) { 
     yield startValue++ 
    } 
} 

const numberFactory = numberIncrementer(0) 
const getNextNumber =() => numberFactory.next().value 

console.log(getNextNumber()) 
// 0 

console.log(getNextNumber()) 
// 1 

console.log(getNextNumber()) 
// 2 

これらの2つの方法を見て、どのような理由私は他の上で1つを選択する必要がありますか?

私は中間 Arrayに頼らず MapObjectを変換し、次の不自然な例で
+0

文法はまったく異なりますか?そして、無限ループよりも少し複雑なことをしようとしてください... – Bergi

+1

多くのAPIに重複があります。この例では、実際には違いは表示されません。特に、クロージャがジェネレータによって作成されているように見えるからです。主な相違点は非同期フローです。 '.next()'メソッドは 'getNextNumber'関数にハードコードされていますが、おそらくもっと適切にその関数の外にあるので、' async'作業の後に 'next()'を呼び出してデータを返すことができます。しかし、私はこのすべてについて間違っている可能性があります... – Pytth

+0

可能な複製https://stackoverflow.com/q/45093404/1048572またはhttps://stackoverflow.com/q/23613612/1048572 – Bergi

答えて

2

function* entries(o) { 
 
    for (let k in o) yield [k, o[k]]; 
 
} 
 

 
const m = new Map(entries({foo: 1, bar: 2})) 
 

 
console.log(
 
    Array.from(m) // [["foo", 1], ["bar", 2]] 
 
);

あなたがアクセスできないように、これは、クロージャでは動作しません。 for/inループの状態を使用して、関数呼び出し間でそれを維持します。状態はループ構造内にカプセル化されます。したがって、ジェネレータで表現できるケースがありますが、クロージャでは表現できません。

関連する問題