解释 JavaScript 中不同类型的生成器
生成器是可以根据程序员的要求暂停和恢复执行的函数。我们在这个函数中使用 yield 关键字来停止代码的执行。生成器在异步编程中非常有用。生成器与编程语言的不同特性相结合,使其自身对程序员有用,以便使用它进行有效的编程。
可以使用生成器函数表达式和生成器函数构造函数来创建生成器:
函数表达式:
function* FUNCTION_NAME( argu1[, argu2[,...argu3]]]) {
// Generator body
}
生成器函数构造函数:
var generator_constructor =
Object.getPrototypeOf( function*(){} ).constructor
var FUNCTION_NAME = generator_constructor()
因为生成器非常有用。让我们来谈谈 javascript 中不同类型的生成器:
普通生成器:它是一种生成器,其中像迭代器这样的生成器在对生成器函数执行每个 next() 方法后生成下一个值。在这种情况下,我们将以连续的方式产生数字,直到最后一个 yield 关键字。
Javascript
function* generator(){
for(var i = 0 ; i<5; i++){
yield i;
}
}
var first_gen = generator();
console.log(first_gen.next().value);
console.log(first_gen.next().value);
console.log(first_gen.next().value);
console.log(first_gen.next().value);
console.log(first_gen.next().value);
Javascript
function* generator(){
para1 = yield ;
console.log(para1);
para2 = yield ;
console.log(para2)
}
var first_gen = generator();
first_gen.next("this is not going to assing any one");
first_gen.next("I am first");
first_gen.next("I am second")
Javascript
var temp = {
*generator(){
yield "1 yield";
yield "2 yield";
}
}
var gen = temp.generator();
console.log(gen.next().value);
console.log(gen.next().value);
Javascript
function* generator1(){
yield "this is first Generator";
}
function* generator2(){
yield* generator1();
yield "this is second Generator";
}
var gen = generator2();
console.log(gen.next().value);
console.log(gen.next().value);
Javascript
function* Return_generator(){
yield "First";
return "Second";
yield "Infinit";
}
var gen = Return_generator();
console.log(gen.next().value);
console.log(gen.next().value);
Javascript
class temp{
*generator(){
yield "Generator with object method ";
yield "Second flow of Generator";
}
}
var temp2 = new temp()
var gen = temp2.generator();
console.log(gen.next().value);
console.log(gen.next().value);
输出:
0
1
2
3
4
带参数的生成器:在此生成器中,我们将参数传递给生成器的 next 方法,并将此参数替换为在暂停函数执行之前的最后一个 yield 关键字。这里生成器函数参数的第一个 next 方法不会替换为任何 yield 关键字,因为在函数的第一次暂停之前没有 yield 关键字。以同样的方式 seconds ,调用 next 方法的参数被替换为第一个 yield 关键字,第三个 next 方法参数被替换为第二个 yield 关键字。
Javascript
function* generator(){
para1 = yield ;
console.log(para1);
para2 = yield ;
console.log(para2)
}
var first_gen = generator();
first_gen.next("this is not going to assing any one");
first_gen.next("I am first");
first_gen.next("I am second")
输出:
I am first
I am second
具有对象属性的生成器:在这种生成器中,生成器被定义为对象的属性。我们可以创建一个生成器实例,然后执行下一个方法以进一步执行生成器。在这种情况下,生成器与普通生成器一样,但它是对象的属性。
Javascript
var temp = {
*generator(){
yield "1 yield";
yield "2 yield";
}
}
var gen = temp.generator();
console.log(gen.next().value);
console.log(gen.next().value);
输出:
1 yield
2 yield
带有另一个生成器的生成器:在这种生成器中,我们有一个生成器,其中包含一个 Yield,其函数体内还有另一个生成器。当执行遇到另一个生成器的 yield 时,它会完成该生成器的执行,然后继续使用主生成器。
Javascript
function* generator1(){
yield "this is first Generator";
}
function* generator2(){
yield* generator1();
yield "this is second Generator";
}
var gen = generator2();
console.log(gen.next().value);
console.log(gen.next().value);
输出:
this is first Generator
this is second Generator
带有返回关键字的生成器:在这种生成器中,函数Body 包含一个返回关键字。在这里,当生成器函数遇到 return 关键字时,它会停止并退出函数的执行并返回值生成器对象。 return 关键字之后将永远不会在我们的程序执行中被执行。
Javascript
function* Return_generator(){
yield "First";
return "Second";
yield "Infinit";
}
var gen = Return_generator();
console.log(gen.next().value);
console.log(gen.next().value);
输出:
First
Second
生成器创建为对象方法:我们可以将生成器创建为对象的方法,并可以根据需要使用它们。在这种情况下,当我们为对象创建一个普通函数时,我们创建了对象的生成器函数。我们可以将 Generator函数与 Object 的实例一起使用。在这种情况下,Generator 可用作 Object 的方法。
Javascript
class temp{
*generator(){
yield "Generator with object method ";
yield "Second flow of Generator";
}
}
var temp2 = new temp()
var gen = temp2.generator();
console.log(gen.next().value);
console.log(gen.next().value);
输出:
Generator with object method
Second flow of Generator