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

标签 javascript ecmascript-6 closures generator

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

关闭方法

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

查看这两种方法,我有什么理由选择其中一种?

最佳答案

在下面的人为示例中,我转换了 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 的状态循环以在函数调用之间维护它。状态被封装在循环构造中。所以有些情况可以用生成器表示,但不能用闭包表示。

关于javascript - JavaScript 中的生成器和闭包有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46119777/

相关文章:

javascript - 如何使用 Ruby 抓取由 Javascript 函数生成的数据?

javascript - 这个函数从内部调用自己做什么?

返回未定义而不是数字的 Javascript 函数

javascript - javascript中括号与 `this`绑定(bind)的效果

javascript - Webpack 开发服务器重新加载,但页面未更改

javascript - 使用 Javascript 转义空白字符

javascript - 通过起始名称获取jquery中输入的值

带闭包的 Swift 变量声明

javascript - 如何调用一个只传递到另一个函数两次的函数?

javascript - 我怎么会误解这个例子中的 JavaScript 闭包解析?