Generator defined using the function* statement syntax:
// function *idMaker(){ <- also possible, even though no reference found
function* idMaker(){
var index = 0;
while(index < index+1)
yield index++;
}
var gen = idMaker();
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3Generator defined using the function* expression syntax:
var idMaker = function*() {
var index = 0;
while(index < index+1)
yield index++;
};
var gen = idMaker();
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3Generator defined using the GeneratorFunction constructor syntax:
var GeneratorFunction = Object.getPrototypeOf(function*(){}).constructor;
var idMaker = new GeneratorFunction('', 'var index = 0;while(index < index+1)yield index++;');
var gen = idMaker();
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3Generator function objects created with the GeneratorFunction constructor are parsed when the function is created. This is less efficient than declaring a generator function with a function* expression and calling it within your code, because such functions are parsed with the rest of the code.
Also note: Generator functions created with the GeneratorFunction constructor do not create closures to their creation contexts; they always are created in the global scope.