SOURCE

// generator的手写应该分为两部分
// 一是,声明了generator的函数被编译后的结果
// 二是,generator函数部分
// 手写是需要注意,generator通过闭包的方式维护了一个对象变量
// 这个对象,有下一次case的值,还有一个stop函数

//原generator函数
//function* test(){
//  let a = 1+2;
//  yield 2;
//  yield 3;     
//}
// console.log(b.next()); // >  { value: 2, done: false }
// console.log(b.next()); // >  { value: 3, done: false }
// console.log(b.next()); // >  { value: undefined, done: true }
function generator(babelAfter){
    return (function(){
        var obj = {
            nextCase: 0,
            stop: function(){}
        }
        return {
            next: function(){
                let ret = babelAfter(obj) 
                if(ret === undefined) return {value: undefined, done: true}
                return {value: ret, done: false}
            }

        } 
    })()
}
// 经过babel编译后的test方法
function test(){
    let a 
    return generator(function(_content){
        while(1){
            switch(_content.prev = _content.nextCase){
                case 0:
                    a = 1 + 2
                    _content.nextCase = 1
                    return 2
                case 1:
                    _content.nextCase = 2
                    return 3
                case 2:
                case 'end':
                    return _content.stop()
            }
        }
    })
}
let b = test()
console.log(JSON.stringify(b.next()))
console.log(JSON.stringify(b.next()))
console.log(JSON.stringify(b.next())) // {value: undefined, done: true}
// console.log(test().next())
console 命令行工具 X clear

                    
>
console