function*

by 1 contributor:

This article is in need of an editorial review.

これは Harmony(ECMAScript 6) 提案の一部であり、実験段階の技術です。
この技術の仕様は安定していません。ブラウザ互換性の一覧表を確認してください。またこれらの構文や動作は、仕様変更などにより、新しいバージョンのブラウザでは変更される可能性があるという点に注意してください。

サマリー

function* 宣言 (末尾にアスタリスクが付いたfunctionキーワード)は、ジェネレーター関数を定義します。

ジェネレーター関数は、 GeneratorFunction コンストラクターとfunction* expressionを使用して定義することもできます。

構文

function* name([param[, param[, ... param]]]) {
   statements
}
name
関数名。
param
関数に渡される引数名。関数は、引数を255個までもつことができる。
statements
関数本体に含まれる命令文。

解説

ジェネレーターは処理を抜け出すことも後から再帰することもできる関数です。ジェネレーターのコンテキスト (変数の値)は再帰しても保存されます。

ジェネレーター関数を呼び出しても関数は直ぐには実行されません。代わりに、関数のためのiterator オブジェクトが返されます。iteratorのnext() メソッドが呼ばれると、ジェネレーター関数の処理は、イテレーターから返された値を特定する最初のyield演算子か、ほかのジェネレーター関数に委任する yield*に達するまで実行されます。next()メソッドは 、生産された値を含むvalueプロパティとジェネレーターが最後の値を持つかを示すdoneプロパティを持つオブジェクトを返します。

単純な例

function* idMaker(){
    var index = 0;
    while(true)
        yield index++;
}

var gen = idMaker();

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
// ...

yield* を使用した例

function* anotherGenerator(i) {
  yield i + 1;
  yield i + 2;
  yield i + 3;
}
function* generator(i){
  yield i;
  yield* anotherGenerator(i);
  yield i + 10;
}

var gen = generator(10);

console.log(gen.next().value); // 10
console.log(gen.next().value); // 11
console.log(gen.next().value); // 12
console.log(gen.next().value); // 13
console.log(gen.next().value); // 20

仕様

Specification Status Comment
ECMAScript 6 (ECMA-262)
The definition of 'function*' in that specification.
勧告候補 Initial definition.

ブラウザ実装状況

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support 39 26.0 (26.0) 未サポート 26 未サポート
yield* (有) 27.0 (27.0) 未サポート 26 未サポート
IteratorResult object instead of throwing ? 29.0 (29.0) 未サポート ? 未サポート
Feature Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (有) 26.0 (26.0) 未サポート 未サポート 未サポート
yield* (有) 27.0 (27.0) 未サポート 未サポート 未サポート
IteratorResult object instead of throwing ? 29.0 (29.0) 未サポート 未サポート 未サポート

Firefox特有のメモ

Firefox26以前のジェネレーターとイテレーター

旧バージョンのFirefoxは旧仕様のジェネレーターを実装しています。旧バージョンでは、 ジェネレーターは違いとして通常のfunctionキーワード(アスタリスクを用いない)を使用して定義されます。

スローの代わりにIteratorResultオブジェクトが返される

Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26)からは、完了したジェネレーター関数はTypeError"ジェネレーターはすでに完了しました"をもはやスローしません。かわりに、{ value: undefined, done: true }のような IteratorResultを返します(バグ 958951)。

関連項目

ドキュメントのタグと貢献者

Contributors to this page: YuichiNukiyama
最終更新者: YuichiNukiyama,
サイドバーを隠す