• Generator函数可以说是Iterator接口的具体实现方式
  • Generator 最大的特点就是可以控制函数的执行。
function* foo(x) {
    var y = 2 * ( yield (x + 1) )
    var z = yield ( y / 3 )
    return (x + y + z)
}

var a = foo(5);
console.log(a.next())
console.log(a.next(12))
console.log(a.next(13))

function* fibonacci() {
    let prev = 0,
        curr = 1
    while(1){
        yield curr
        let temp = prev
        prev = curr
        curr = curr + temp
    }
}

for(let n of fibonacci()){
    if(n > 1000) break;
    console.log(n);
}

// yield* 用来在一个 Generator 函数里面执行另一个 Generator 函数。
// 可以很方便地取出嵌套数组的所有成员。
function* iterTree(tree) {
    if(Array.isArray(tree)){
        for(let v of tree){
            yield* iterTree(v)
        }
    }else {
        yield tree
    }
}

let tree = ['A', ['B','C'],['D',['E','F']],'G']
console.log(...iterTree(tree))