说明
Generator 函数是 ES6 提供的 一种异步编程解决方案,语法行为与传统函数完全不同。
Generator函数有两个特征:
- function命令与函数名 之间有一个'*'
- 函数体内部使用 yield语句定义不同的内部状态。
Generator函数定义
function* hello() { yield "hello"; yield "world"; return "done"; } let h = hello(); // 此时拿到的是一个Generator对象
当调用它的next时 ,才会进入它的方法体,遇到yield,直接返回语句内容 ,并停止执行后面的语句,第二次调用next时 ,会执行下一条yield
例如打印上面定义的 Generator函数变量
console.log(h.next()); //{value:"hello", done: false} console.log(h.next()); //{value:"world", done: false} console.log(h.next()); //{value:"done", done: true} console.log(h.next()); //{value: undefined, done: true}
通过执行结果我们可以看到,通过hello()返回的h对象,每调用一次next()方法返回一个对象,该对象包含了value值和done状态。
直到遇到return关键字或者函数执行完毕,这个时候返回的状态为ture,表示已经执行结束了。
循环遍历
通过for…of可以循环遍历Generator函数返回的迭代器。
let y = hello(); for (let v of y) { console.log(v); //输出 hello world }
代码案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ES6新特性学习-(13)-Generator函数</title> </head> <body> <script> function* hello() { yield "hello"; yield "world"; return "done"; } let h = hello(); // 拿到一个Generator对象 console.log(h.next()); //{value:"hello", done: false} console.log(h.next()); //{value:"world", done: false} console.log(h.next()); //{value:"done", done: true} d console.log(h.next()); //{value: undefined, done: true} // 通过for...of可以循环遍历Generator函数返回的迭代器。 let y = hello(); for (let v of y) { console.log(v); //输出 hello world } </script> </body> </html>