function*语句允许你声明一个生成器函数,这种函数的返回值是一个Generator对象,它允许你控制函数的暂停、继续执行。这种同步操作允许我们使用JavaScript的异步编程——function*每次只返回一个特殊的指针,并不直接真正地返回值,因此function*内外的代码可以同时执行。

function* generator(param,...)
{
...
yield ...
}

异步执行

function* add(inc){
inc++
yield inc++
yield inc++
}
let f=add(10)
f.next()//inc==11 { value: 11, done: false }
f.next()//inc==12 { value: 12, done: false }
f.next()//inc==13 { value: undefined, done: true }

遇到yield时函数会暂停执行后面的代码,直到next()方法被调用,该方法的返回值包括表达式的结果和完成状态。使用函数生成器时函数不会执行,因此需要使用一次next()。

上文的程序为什么到最后变成undefined呢?这是因为每次next()都会执行到yield关键字后的表达式处,并且将yield后的表达式结果作为value返回。而add函数内只有两个yield,虽然三次调用next()才能完成调用过程,但最后一次不返回value,在函数末尾加上return语句就能让next返回return后的表达式值。值得一提的是,函数生成器返回的是Generator对象,但这不影响在函数生成器内使用return。

为什么value=11和12,不应该12和13吗?inc++实际上是先返回inc再+1,这里就是inc++和++inc的差别。