[JavaScript基礎]学習①⑨-- generator
1922 ワード
generatorは複数回の関数を返すことができます
function* foo(x) {
yield x + 1;
yield x + 2;
return x + 3;
}
フィボナッチ数列を挙げる
function fib(max) {
var
t,
a = 0,
b = 1,
arr = [0, 1];
while (arr.length < max) {
t = a + b;
a = b;
b = t;
arr.push(t);
}
return arr;
}
// :
fib(5); // [0, 1, 1, 2, 3]
fib(10); // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
function* fib(max) {
var
t,
a = 0,
b = 1,
n = 1;
while (n < max) {
yield a;
t = a + b;
a = b;
b = t;
n ++;
}
return a;
}
generatorオブジェクトの呼び出し
第1種
var f = fib(5);
f.next(); // {value: 0, done: false}
f.next(); // {value: 1, done: false}
f.next(); // {value: 1, done: false}
f.next(); // {value: 2, done: false}
f.next(); // {value: 3, done: true}
f.next().value
doneは、このgeneratorが実行済みかどうかを示します.doneがtrueの場合、valueはreturnの戻り値です.
第2種
for (var x of fib(5)) {
console.log(x); // 0, 1, 1, 2, 3
}
generatorはオブジェクト向けに実現できる機能を実現できます
練習:自増ID
var current_id = 0;
function next_id() {
current_id ++;
return current_id;
}
'use strict';
function* next_id() {
var id = 1;
while (true) {
yield id++;
}
return true;
}
var g=next_id();
for(var x=1;x<10;x++){
alert(g.next().value);
}//1 2 3 4 5 6 7 8 9
// :
var
x,
pass = true,
g = next_id();
for (x = 1; x < 100; x ++) {
if (g.next().value !== x) {
pass = false;
alert(' !');
break;
}
}
if (pass) {
alert(' !');
}