JavaScript中的生成器和闭包有什么区别?

Saw*_*oes 3 javascript closures generator ecmascript-6

对同一问题使用这两种解决方案有什么区别?

封闭方式

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

console.log(getNextNumber())
// 0

console.log(getNextNumber())
// 1

console.log(getNextNumber())
// 2
Run Code Online (Sandbox Code Playgroud)

生成器方法

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
Run Code Online (Sandbox Code Playgroud)

查看这两种方法,我为什么要选择一种方法呢?

小智 5

在以下人为设计的示例中,我不依赖中间体将Objecta 转换为a :MapArray

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]]
);
Run Code Online (Sandbox Code Playgroud)

这对于闭包不起作用,因为您无法访问for/in循环状态以在函数调用之间维护它。状态被封装在循环构造中。因此,有些情况可以用生成器来表达,而不能用闭包来表达。