迭代器结构
var something = ( function ( ) {
var nextVal;
return {
[ Symbol. iterator] : function ( ) { return this ; } ,
next: function ( ) {
if ( nextVal === undefined) {
nextVal = 1 ;
}
else {
nextVal = ( 3 * nextVal) + 6 ;
}
return { done: false , value: nextVal } ;
}
} ;
} ) ( ) ;
something. next ( ) . value;
something. next ( ) . value;
something. next ( ) . value;
something. next ( ) . value;
在for…of 循环在每次迭代中自动调用 next(),它不会向 next() 传入任何值,并且会在接收到 done:true 之后自动停止。
for ( var v of something) {
console. log ( v ) ;
if ( v > 500 ) {
break ;
}
}
for (
var ret;
( ret = something. next ( ) ) && ! ret. done;
) {
console. log ( ret. value) ;
if ( ret. value > 500 ) {
break ;
}
}
使用生成器的方式实现之前的something
function * something ( ) {
try {
var nextVal;
while ( true ) {
if ( nextVal === undefined) {
nextVal = 1 ;
}
else {
nextVal = ( 3 * nextVal) + 6 ;
}
yield nextVal;
}
}
finally {
console. log ( "cleaning up!" ) ;
}
}
使用方式和上述类似,停止方式可以增加return的方式。 调用 it.return(…) 之后,它会立即终止生成器,这当然会运行 finally 语句。 另外,它还会把返回的 value 设置为传入 return(…) 的内容,这也就是 “Hello World” 被传出去的过程。 现在我们也不需要包含 break 语句了,因为生成器的迭代器已经被设置为done:true,所以 for…of 循环会在下一个迭代终止。
var it = something ( ) ;
for ( var v of it) {
console. log ( v ) ;
if ( v > 500 ) {
console. log (
it. return ( "Hello World" ) . value
) ;
}
}
it. throw ( err ) ;