除了前2篇文章中描述的可迭代对象以外,在js语言扩展中的生成器对象,也可以作为可迭代对象。

这里用到一个新的关键字yield,该关键字在函数内部使用,用法和return类似,返回函数中的一个值;yield和return区别在于,使用yield的函数“返回”的这个值是可保持内部状态的。(我也没办法用猫的语言表达能力将其表达清楚,如果你懂得ruby之类的动态语言可能早就明白其含义,不明白的见后面的代码吧 :))

任何使用关键字yield的函数(哪怕yield在代码逻辑中是不可达的)都称为“生成器函数”(generator function),生成器函数通过yield返回值。这些函数可以通过return终止函数的执行而不带任何返回值,但不能使用return返回一个值。

然而和普通函数一样,生成器函数也通过关键字function声明,typeof运算符也返回”function”,并且可以从Function.prototype继承属性和方法。要点是:生成器函数调用并不执行生成器函数的函数体,而是返回一个生成器对象!

生成器对象包含一个next()方法,可以恢复生成器函数的执行,直到遇到下一个yield语句为止。这时生成器函数中的yield语句的参数就是next()方法的返回值值,如果生成器函数执行return或者到达函数体的末尾终止,则next()将抛出StopIteration.

function r(min,max){
   for(let i = Math.ceil(min);i <= max;i++)
     yield i*i;
}

for(let n in r(1,10))
  console.log(n);

生成器包含一个close()方法,当调用时和它相关的生成器函数就会终止执行,就像在函数运行挂起位置执行了一条return语句。如果当前挂起位置在一个或多个try语句块中,则首先运行finally从句,在执行close()返回。close()没有返回值,但若finally产生了异常则该异常会传播给close();

生成器对象还包括一个send方法,其可以带一个参数,该值将成为yield表达式的值(如果把yield看做语句或函数,则该参数就是语句或函数的返回值);

除了next()和send()之外生成器还有一个throw()方法,如果调用这个方法,yield表达式就将参数作为异常抛给throw(),见如下代码:

function cf(init){
    let next_v = init;
  while(true){
    try{
      let inc = yield next_v;
      if(inc)
        next_v += inc;
      else
        next_v++;
    }
    catch(e){
      if(e === "reset")
        next_v = init;
      else
        throw e;
    }
  }
}

var c = cf(10);
console.log(c.toString());
console.log(c.next());
console.log(c.send(10));
console.log(c.throw("reset")); //next_v == 10;
console.log(c.next());

//我们可以让reset稍微优雅点
c.reset = function(){
  return this.throw("reset");
}

/*but Generator is not defined!!!
注释中的代码会报错!!!
Generator.prototype.reset = function(){
   return this.throw("reset");
}
*/

console.log(c.reset());

最新文章

  1. 【WPF】ChartControl的使用
  2. Ubuntu14.04 lamp环境 php mongodb扩展安装
  3. CSS3–1.css3 新增选择器
  4. 现代JavaScript
  5. Twemproxy 介绍与使用
  6. SQL——连接查询
  7. Codeforces Round #336 (Div. 2)A. Saitama Destroys Hotel 水题
  8. jQuery对Select操作大集合
  9. NOI2009植物大战僵尸
  10. java创建对象的四种方式
  11. hibernate和mybatis思想,区别,优缺点
  12. Chaperon简介
  13. Java解析和生成XML
  14. 2014多校3 Wow! Such Sequence!段树
  15. Netty IO线程模型学习总结
  16. ListView单选的实现总结(转)
  17. 开源的.Net ORM微型框架SuperHelper
  18. CodeForces 703C Chris and Road
  19. CSV文件解析工具
  20. Android开发艺术2之Activity的启动模式

热门文章

  1. JDBC-数据库的编程(一)
  2. 【并发编程】ThreadPoolExecutor参数详解
  3. Android初级教程XUtils实现“断点续传”下载
  4. RAMCloud:内存云存储的内存分配机制
  5. HMM:隐马尔科夫模型-前向算法
  6. 平述factory reset ——从main system到重引导流程
  7. 【翻译】在Ext JS应用程序中构建可维护的控制器
  8. pig的cogroup详解
  9. Spring AOP 初探
  10. [RDLC]一步一步教你使用RDLC(一)