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);
输出:
0
1
2
3
4
带参数的生成器: 在这个生成器中,我们通过传递参数给生成器的next方法,它会用该参数替换掉在函数暂停执行之前最后一个yield关键字。在函数的第一个暂停之前没有任何yield关键字,因此生成器函数的第一个next方法的参数不会被替换。同样地,第二个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 assign any one");
first_gen.next("I am first");
first_gen.next("I am second")
输出:
I am first
I am second
带有对象属性的生成器: 在这种类型的生成器中,生成器被定义为对象的属性。我们可以创建一个生成器实例,然后执行next方法来进一步执行生成器。在这种情况下,生成器与普通生成器相同,但它是一个对象的属性。
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
生成器与返回关键字: 在这种生成器中,函数主体包含一个return关键字。当生成器函数遇到return关键字时,它会停止执行函数,并返回生成器对象的值。在程序执行过程中,return关键字之后的代码将不会被执行。
Javascript
function* Return_generator(){
yield "First";
return "Second";
yield "Infinite";
}
var gen = Return_generator();
console.log(gen.next().value);
console.log(gen.next().value);
输出:
First
Second
Generator created as Object method: 我们可以将生成器创建为对象的方法,并根据需要使用它们。在这种情况下,我们像创建普通函数一样创建对象的生成器函数。我们可以在对象的实例上使用生成器函数。在这种情况下,生成器作为对象的方法可用。
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
极客教程