Generator学习

Generator

基本概念

  • Generator可以理解为一个状态机,封装了多个内部状态

  • 执行Genertaor函数会返回一个遍历器对象。

  • 特征

    • function关键字和函数名之间有一个*
    • 函数内部使用yield语句,用来定义不同状态。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    function* helloWorldGenerator() {
    yield 'hello';
    yield 'world';
    return 'ending';
    }
    var hw = helloWorldGenerator();
    hw.next()
    // { value: 'hello', done: false }
    hw.next()
    // { value: 'world', done: false }
    hw.next()
    // { value: 'ending', done: true }
    hw.next()
    // { value: undefined, done: true }

    Generator函数调用不会执行,返回的是指向内部状态的指针对象。

    调用遍历器对象的next方法,使指针移向下移状态。

    每次调用next内部指针(执行流)从函数头部或者上次停止地方开始执行,直到下一个yield语句(或return)。

yield语句

  • next调用时
    • 执行到yield语句,暂停执行后面操作yield后表达之,作为返回的对象和的value
    • 再次调用yield继续向下执行,直到下一个yield语句
    • 执行到return语句,将return语句后表达式的值,作为返回对象的value
    • 函数没有return,返回valueundefined
    • yield语句后的表达式,调用时才会执行(惰性求值Lazy Evaluation)
  • yieldreturn
    • 都返回之后表达式的值
    • 一个函数只能有一个return,可以多个yield
    • yield不能在普通函数中使用