LoginSignup
0
0

More than 3 years have passed since last update.

【javascript】ジェネレータ関数 復習

Last updated at Posted at 2020-07-17

この記事は以下の書籍を参考にして執筆しました。

ジェネレータ関数

ジェネレータ関数を定義する

//どれでも可
function *myGenerator(){} 
function * myGenerator(){}
function* myGenerator(){}

出典:入門JavaScriptプログラミング

ジェネレータ関数と普通の関数の違い

yield

  • 処理を中断しreturn文同様、外側に値を渡す。
  • return文と異なり式であり、関数内で後から使用する値を取得できる
function* myGeneratorFunction() {
  const message='Hello'
  const response=yield message //外側のプロセスからの値を捕捉
}

出典:入門JavaScriptプログラミング

yieldが出現したところで中断して、valueとdoneプロパティを持つオブジェクトを返すして、外側のプロセスから再開の合図が来るのを待つ。

その時に外側から値が渡された場合はレスポンスとしてここで補足する。

function* myGeneratorFunction() {
  console.log('スタート')
  let revievedA = yield 'a'
  console.log('revievedA:', revievedA)
  let revievedB = yield 'b'
  console.log('revievedB:', revievedB)
}

const myGen = myGeneratorFunction()

let gotA = myGen.next('引数0') //スタート
console.log('gotA:', gotA) //gotA: {value: "a", done: false}
let gotB = myGen.next('引数1') //revievedA: 引数1
console.log('gotB:', gotB) //gotB: {value: "b", done: false}
let gotC = myGen.next('引数2') //revievedB: 引数2
console.log('gotC:', gotC) //gotC: {value: undefined, done: true}

出典:入門JavaScriptプログラミング

最初のnext呼び出しで'引数0'が使われていない

これは最初のnext呼び出しがそれ以降の呼び出しのようにyieldに関連付けられていないから

最初の呼び出しはジェネレータを初期状態から呼び起こすためのもの。

初期値を渡すなら通常の関数パラメータを使用する

function* myGeneratorFunction(val) {
//...  
}

const myGen = myGeneratorFunction('引数')

出典:入門JavaScriptプログラミング

では一つ一つ見ていく
javascript
const myGen = myGeneratorFunction()

ジェネレータ関数が呼び出され、新しいジェネレータオブジェクトが返される。
ジェネレータ関数内のコードはまた実行されない。

let gotA = myGen.next('引数0')

出典:入門JavaScriptプログラミング

1つ目のnext呼び出しで1つめのyieldまでのコードが実行される。
yieldに渡された値はnext呼び出しから返されるオブジェクトのvalueプロパティになる

let gotB = myGen.next('引数1')

出典:入門JavaScriptプログラミング

2つ目のnextで、実行を中断したところから2つ目のyieldまでのコードを実行

let gotC = myGen.next('引数2')

出典:入門JavaScriptプログラミング

doneプロパティにtrueが設定される。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0