什么事Generator函数
Generator
函数是ES6提供的一种异步编程解决方案, 可以把Generator
函数看做是一个状态机 ,封装了多个内部状态.
2.执行
Generator
函数会返回一个遍历器对象, 也就是说,Generator
函数除了状态机, 还是一个遍历器对象生成函数.
外观上的变化
形式上Generator
函数是一个普通的函数, 但是有两个特征
-
function
关键字与函数名之间有一个星号 - 函数体内部使用
yield
语句, 定义不同的内部状态
function* helloWorldGenerator() {
yield 'hello';
yield 'world';
return 'ending';
}
var hw = helloWorldGenerator();
上面定义了一个helloWorldGenerator
, 它内部有两个yield
语句hello
和world
, 即函数有三个状态: hello
, world
和return
语句(结束执行)
generator
函数的调用方法和普通的函数一样, 也是在函数名后面加上一对圆括号. 不同的地方在于Generator
函数返回的是一个遍历器对象(Iterator Object
)
下一步必须调用遍历器的next
方法, 使得指针移向下一个状态, 也就是说每次调用next
方法, 内部指针就会从函数头部或者上一次停下来的地方开始执行, 知道遇到下一个yield
或return
语句为止. 换句话说, Generator
函数是分段执行的, yield
语句是暂停执行的标记, 而next
方法可以恢复执行.
hw.next()
// { value: 'hello', done: false }
hw.next()
// { value: 'world', done: false }
hw.next()
// { value: 'ending', done: true }
hw.next()
// { value: undefined, done: true }
上面代码一共调用了四次next
方法
yield
语句
由于
Generator
函数返回的是一个遍历器对象, 只有调用next
方法的时, 才会进入下一个内部状态, 所以提供了一个可是暂停执行的函数.yield
语句就是暂停的标志
next
方法的运行逻辑
- 遇到
yield
语句, 就暂停执行后面的操作, 并将紧跟在yield
后面的那个表达式的值, 作为返回对象的value
属性 - 下次调用
next
方式时, 再继续往下执行, 直到遇到下一个yield
语句 - 如果没有再次遇到新的
yield
语句, 就一直运行的函数结束, 直到return
位置, 并将return
语句后面的表达式的值, 作为返回对象的value
属性的值 - 如果函数没有
return
语句, 则返回对象的value
属性为undefined
yield
和return
的差异
- 每次遇到
yield
函数都会暂停执行, 下一次再从该位置继续向后执行, 而return
语句不具备位置记忆功能. -
yield
在一个函数中可以执行多次, 而return
只能执行一次 - 正常的函数只能返回一个值, 因为只能执行一次
return
语句,Generator
函数可以返回一系列的值, 以为可以有任意多个yield
. 也可以说是生成了一系列之, 这也就是他名字的来历(generator
这个词是生成器的意思)
yield
和return
的相同点
- 他们都返回紧跟在语句后面的那个表达式
网友评论