GeneratorFunction

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.

GeneratorFunction コンストラクターは、新しいジェネレーター関数オブジェクトを生成します。 JavaScript では、すべてのジェネレーター関数が実際に GeneratorFunction オブジェクトです。

GeneratorFunction はグローバルオブジェクトではないことに注意してください。次のコードを評価することによって得られます。

js
Object.getPrototypeOf(function* () {}).constructor;

試してみましょう

構文

new GeneratorFunction ([arg1[, arg2[, ...argN]],] functionBody)

引数

arg1, arg2, ... argN

形式的な引数名として関数に使用される名前です。それぞれが有効な JavaScript の識別子であるか、カンマで区切った文字列のリストで、例えば "x", "theValue", "a,b" などです。

functionBody

関数定義を構成する JavaScript 文を含む文字列。

解説

GeneratorFunction コンストラクターで生成されたジェネレーター関数オブジェクトは、関数が生成されたときにパースされます。これは、ジェネレーター関数を function* 式で定義してからコード内で呼び出す方法ほど効率的ではありません。というのも、そのような関数はコードの残りの部分と共にパースされるからです。

関数に渡されたすべての引数は、渡された順に、作成される関数内の引数の識別子の名前として扱われます。

メモ: ジェネレーター関数GeneratorFunction コンストラクターによって生成された場合、生成コンテキストのクロージャは作成されません。常にグローバルスコープに生成されます。

実行すると、ローカル変数とグローバルグローバル変数にのみアクセスでき、 GeneratorFunction コンストラクターが呼び出されたスコープの変数にはアクセスできません。

これは、ジェネレーター関数式のコードで eval を使用した場合とは異なります。

GeneratorFunction コンストラクターを (new 演算子を使用せずに) 関数として呼び出した場合、コンストラクターとして呼び出したときと同じ効果があります。

GeneratorFunction() コンストラクターからジェネレーター関数を生成する

js
var GeneratorFunction = Object.getPrototypeOf(function* () {}).constructor;
var g = new GeneratorFunction("a", "yield a * 2");
var iterator = g(10);
console.log(iterator.next().value); // 20

仕様書

Specification
ECMAScript Language Specification
# sec-generatorfunction-objects

ブラウザーの互換性

BCD tables only load in the browser

関連情報