📅  最后修改于: 2021-01-01 03:56:37             🧑  作者: Mango
生成器(或Generator 函数)是ES6中引入的新概念。它为您提供了一种处理迭代器和函数的新方式。
ES6生成器是另一种函数,可以在中间暂停一次或多次,然后可以稍后恢复。当标准函数被调用时,控制权在调用的函数,直到它返回,但在发电机ES6允许调用函数来控制一个被调用的函数的执行。
生成器与常规函数相同,除了:
生成器函数的语法几乎与常规函数相同。唯一的实际区别是,生成器函数通过在函数关键字后缀星号(*)来表示。
在下面的语法中,我们向您展示定义生成器函数的一些有效方法:
function* mygenfun() // Valid
{
yield 1;
yield 2;
...
...
}
function *mygenfun() // Valid
{
yield 1;
yield 2;
...
...
}
function*mygenfun() // Valid
{
yield 1;
yield 2;
...
...
}
function* gen()
{
yield 100;
yield;
yield 200;
}
// Calling the Generator Function
var mygen = gen();
console.log(mygen.next().value);
console.log(mygen.next().value);
console.log(mygen.next().value);
输出量
100
undefined
200
yield语句将中止函数执行,并将值发送回调用方。它保留了足够的状态,以使函数可以从中断处恢复。恢复后,该函数将在上次运行yield之后立即继续执行。它可以产生一系列值。
在上面的示例中,我们使用了next()方法,这是生成器的主要方法。当调用next()方法用一个参数沿,它会恢复发生器函数的执行,取代了产生表达式,其中的执行被暂停与来自下一个()方法的参数。
next()方法的结果始终是一个具有两个属性的对象:
例如,在这里,我们正在创建一个生成器函数并获取其产生的值。
function* show() {
yield 100;
}
var gen = show(); //here 'gen' is a generator object
console.log(gen.next()); // { value: 100, done: false }
输出量
{ value: 100, done: false }
生成器函数返回生成器对象。生成器对象是生成器函数的实例,它既符合iterable接口,又符合iterator接口。
可以通过调用next()方法或在循环中使用生成器对象来使用生成器对象。生成器对象是一个迭代器;这就是为什么可以在for…of循环或接受迭代的其他函数中使用它的原因。
在上面的next()方法示例中,变量gen是生成器对象。
Return用于将指定的值发送回其调用方。它用于结束函数调用执行,并将结果返回给调用方。在一个函数,在return语句之后定义的语句不会执行。这就是为什么return语句应该是该函数的最后一条语句。
让我们尝试通过一个示例来了解生成器中的return语句:
function* myGen() {
yield 'First yield statement';
yield 'Second yield statement';
return 'Return statement';
yield 'Second yield statement';
}
let genobj = myGen();
console.log(genobj.next()); //returns {value: 'First yield statement', done: false}
console.log(genobj.next()); //returns {value: 'Second yield statement', done: false}
console.log(genobj.next()); //returns {value: 'Return statement', done: true}
console.log(genobj.next()); //returns {value: undefined, done: true}
输出量
{ value: 'First yield statement', done: false }
{ value: 'Second yield statement', done: false }
{ value: 'Return statement', done: true }
{ value: undefined, done: true }
在上面的示例中,我们定义了一个生成器函数myGen() ,其中定义了四个语句,包括三个yield语句和return语句。每当我们调用next()方法时,函数继续执行,直到命中下一个yield语句为止。
您会注意到第一个next()方法如何返回“第一个yield语句”。当我们第二次调用next()方法时,它将恢复执行并返回“ Second yield statement” 。再次调用next()方法后,该函数不再找到yield语句并返回“ Return语句”。但是当我们第四次调用next()方法时,它将不考虑yield语句,并且返回undefined,因为它是在return语句之后编写的。
您可以在上面示例的输出中看到, next()方法在return语句之后不考虑任何语句。
将for…of循环与生成器函数会减少代码行。在以下示例中,您可以看到相同的插图。
"use strict"
function* vowels() {
// here the asterisk marks this as a generator
yield 'A';
yield 'E';
yield 'I';
yield 'O';
yield 'U';
}
for(let alpha of vowels()) {
console.log(alpha);
}
输出量
A
E
I
O
U
注意:生成器功能无法使用箭头功能表示。