Generator函数
概念
Generator 函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。
yield
运行逻辑
遍历器对象的next
方法的运行逻辑如下。
遇到
yield
表达式,就暂停执行后面的操作,并将紧跟在yield
后面的那个表达式的值,作为返回的对象的value
属性值。下一次调用
next
方法时,再继续往下执行,直到遇到下一个yield
表达式。如果没有再遇到新的
yield
表达式,就一直运行到函数结束,直到return
语句为止,并将return
语句后面的表达式的值,作为返回的对象的value
属性值。如果该函数没有
return
语句,则返回的对象的value
属性值为undefined
。
需要注意的是,yield
表达式后面的表达式,只有当调用next
方法、内部指针指向该语句时才会执行,因此等于为 JavaScript 提供了手动的“惰性求值”(Lazy Evaluation)的语法功能。
yield只能用在Generator函数里面
上面代码在一个普通函数中使用yield
表达式,结果产生一个句法错误。
yield在另外的表达式中,必须放在圆括号中
暂缓执行
Generator 函数可以不用yield
表达式,这时就变成了一个单纯的暂缓执行函数。
上面代码中,函数f
如果是普通函数,在为变量generator
赋值时就会执行。但是,函数f
是一个 Generator 函数,就变成只有调用next
方法时,函数f
才会执行。
next()
next 方法可以带有一个参数,该参数会被当做上一条 yield 语句的返回值。
最后更新于