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*

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