JavaScript生成器教程

50 阅读2分钟

生成器是一种特殊的函数,它能够自我暂停,并在稍后恢复,允许其他代码在此期间运行。

生成器是一种特殊的函数,它能够暂停自己,并在稍后恢复,允许其他代码在此间运行。

代码决定它必须等待,所以它让其他代码 "在队列中 "运行,并保持 "当它所等待的东西 "完成后恢复其操作的权利。

所有这些都是通过一个简单的关键字完成的:yield 。当一个生成器包含这个关键字时,执行就会停止。

一个生成器可以包含许多yield 关键字,从而使自己多次停止,它由*function 关键字来识别,这与C、C++或Go等低级编程语言中使用的指针解除定义操作符不能混淆。

生成器在JavaScript中实现了全新的编程范式,允许。

  • 生成器运行时的双向通信
  • 长时间的while循环,不会使你的程序冻结。

下面是一个生成器的例子,它解释了这一切是如何工作的。

function *calculator(input) {
    var doubleThat = 2 * (yield (input / 2))
    var another = yield (doubleThat)
    return (input * doubleThat * another)
}

我们用以下方式初始化它

const calc = calculator(10)

然后我们在生成器上启动迭代器。

这第一个迭代启动了迭代器。代码返回这个对象。

发生的情况是:代码运行函数,input = 10 ,因为它是在生成器构造器中传递的。它一直运行到yield ,并返回yield 的内容:input / 2 = 5 。所以我们得到了一个5的值,并表明迭代还没有完成(函数只是暂停了)。

在第二次迭代中,我们传递了一个值7

而我们得到的结果是。

{
  done: false
  value: 14
}

7 被作为 的值。 重要的是:你可能会读出 是参数,但那只是第一次迭代的返回值。我们现在跳过这一点,使用新的输入值, ,并将其乘以2。doubleThat input / 2 7

然后我们到达第二个收益率,返回doubleThat ,所以返回值是14

在下一次,也是最后一次迭代中,我们传入100

并返回我们得到

{
  done: true
  value: 14000
}

迭代完成后(没有找到更多的收益率关键字),我们只返回(input * doubleThat * another) ,相当于10 * 14 * 100