GeneratorFunction
在 JavaScript 中,生成器函数实际上都是 GeneratorFunction
对象。注意,GeneratorFunction
并不是一个全局对象,但你可以通过下面的代码创建 GeneratorFunction()
构造函数。
js
const GeneratorFunction = function* () {}.constructor;
语法
js
new GeneratorFunction(functionBody)
new GeneratorFunction(arg0, functionBody)
new GeneratorFunction(arg0, arg1, functionBody)
new GeneratorFunction(arg0, arg1, /* … ,*/ argN, functionBody)
GeneratorFunction(functionBody)
GeneratorFunction(arg0, functionBody)
GeneratorFunction(arg0, arg1, functionBody)
GeneratorFunction(arg0, arg1, /* … ,*/ argN, functionBody)
备注: 调用 GeneratorFunction()
时可以选择使用或不使用 new
。两者均可创建一个新的 GeneratorFunction
实例。
参数
描述
生成器函数对象是在给构造函数传递参数,创建函数时才进行解析的。这比使用 function*
表达式声明生成器函数,然后在代码中调用它的效率更低,因为这些函数与其余的代码一起被解析。
传递给函数的所有参数(除了最后一个)按照它们被传递的顺序被视为要创建的函数中参数的标识符的名称。
备注: 使用 GeneratorFunction
构造函数创建的生成器函数不会为其创建上下文创建闭包;它们始终在全局范围内创建。
当运行它们时,它们只能访问自己的本地变量和全局变量,而不能访问 GeneratorFunction
构造函数调用的范围内的变量。
这是它与使用 eval
来创建生成器函数表达式不同的地方。
将 GeneratorFunction
构造函数调用为函数(不使用 new
运算符)与将其作为构造函数调用的效果相同。
示例
创建和使用 GeneratorFunction() 构造函数
js
const GeneratorFunction = function* () {}.constructor;
const g = new GeneratorFunction("a", "yield a * 2");
const iterator = g(10);
console.log(iterator.next().value); // 20
规范
Specification |
---|
ECMAScript Language Specification # sec-generatorfunction-objects |
浏览器兼容性
BCD tables only load in the browser