generator 生成器

generator

  • 定义:用来生成使用 yield 表达式创建的生成器

    • yield返回数据格式
      • { value: 得到的结果 , done: 布尔值(告知generator函数是否执行完毕) }
  • 实例:

    	/**
        *必须在函数前面添加“*”已告知是generator函数
        *value即yield表达式所生成的数据
        */
        
        function* gen(x){
          yield x + 2;
        };
        
        let g = gen(1);
        
        //返回 yield 表达式产生的值.
        g.next();        // { value: 3 , done:false}
        
        //在来执行一遍g.next()返回的结果是?
        g.next();       // { value: undefind , done:true}
        //表示,已经将x+2执行成功,并且下面没有要执行的函数
        
        //如我们使用g.next(100)返回的结果是?
        g.next();       // { value: 100 , done:true}
        
        /**为什么会输出这样的结果呢?
        *而不是{ value: 102 , done:false}
        *因为gen(1)方法已经执行完毕了,但是我们调用next(100),
        方法是告诉generator函数,下一个yield *表达式产生的值,是什么
        */
    
  • 下面实例用以理解generator函数

    function* foo(x) {
        yield x + 1;
        yield x - 2;
    };
    let f = foo(2);
    f.next();       // { value: 3 , done:false}
    f.next();       // { value: 0 , done:false}
    f.next();       // { value: undefind , done:true}
    
    /**
    *如上例子告诉我们,当调用next()方法的时候成只会一个yield
    *且调用当一个yield已完成,下次再调用next()方法也不会执行,只会执行未执行yield
    */
    
    //一个无限迭代器
    function* idMaker(){
        let index = 0;
        while(true)
            yield index++;
    }
    
    let gen = idMaker();
    
    console.log(gen.next()); 
    // { value: 1 , done:false}
    console.log(gen.next()); 
    // { value: 2 , done:false}
    console.log(gen.next()); 
    // { value: 3 , done:false}
    // ...
    
    //有的同学就会问到,为什么yield执行完毕还会执行?
    //因为:每次在while循环中都会生成一个新的yield
    
  • 详细请产考https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/function*

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章