对同一问题进行这两种解决方案之间的区别是什么?
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
查看这两种方法,我有什么理由选择其中一种?
答案 0 :(得分:3)
在以下设计示例中,我将Object
转换为Map
而不依赖于中间Array
:
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
循环的状态以在函数调用中保持它。状态封装在循环结构中。所以有些情况可以用生成器来表达,但不能用闭包来表达。