JavaScript 中的异步原理( 二 )


当执行到 yield 语句时 ,  Generator 的栈帧同样会被弹出栈外 , 但 Generator 在这里耍了个花招 —— 它在堆里保存了栈帧的引用(或拷贝)!这样当 it.next 方法被调用时 ,  JS 引擎便不会重新创建一个栈帧 , 而是把堆里的栈帧直接入栈 。因为栈帧里保存了函数执行所需的全部上下文以及当前执行的位置 , 所以当这一切都被恢复如初之时 , 就好像程序从原本暂停的地方继续向前执行了 。
而因为每次 yield 和 it.next 都对应一次出栈和入栈 , 所以可以直接利用已有的栈机制 , 实现值的传出和传入 。




推荐阅读