JavaScript 解释不同类型的生成器

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程