//普通的 1,1,2,3,5,8... function fibonacci(n){ if(n==1) return 1; if(n==2) return 1; else return fibonacci(n-1)+fibonacci(n-2); } //yield生成器 function fibonacci(){ let x=0,y=1; while(true){ yield y; [x,y]=[y,x+y]; } } f = fibonacci(); for(let i = 0; i< 10; i++) console.log(f.next()); f.close() //释放 //生成器是懒惰的,因此在某些时候性能更高。由于并非立马运算,而是在须要是计算。 /*下面是一个文本处理的例子*/ //分隔成行,没有使用split,那样会每次处理整个字符串,并分配一个数组 function eachline(s){ let p; while((p = s.indexOf('\n')) != -1){ yield s.substring(0,p); s = s.substring(p+1); } if(s.length >0) yield s; } function map(lines,f){ for(let l in lines){ yield f(l); } } function select(lines,f){ for(let l in lines){ if(f(l)){ yield l; } } } let text= "#comment \n \n hello \n world\n quit \n"; //首先分隔成行 let lines = eachline(text); //去掉每行的首末空白 let trimmed = map(lines,function(l){ return l.trim(); }) //最后,忽略空行和注释 let nonblank = select(trimmed,function(l){ return l.length >0 && l[0] != "#" }) //从管道中取出处理过的行 ,才开始真正的执行 for(let l in nonblank){ if(l === "quit") break; console.log(l); }