//普通的 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); }