関数をわたす

INPUT · スライド

コールバックに値を渡す

01 / 05

要素は誰が入れていた?

forEach に渡した関数は (item) => { ... } のように引数を受け取っていた。あの item、誰が入れていたんだろう。

答えは forEach の側。受け取った関数を呼ぶときに fn(要素) と書いていたんだ。

呼ぶときにかっこの中へ値を書けばいい。ふつうの関数呼び出しと同じだよ。

02 / 05

呼ぶときに値を渡す

受け取った関数を fn(10) と呼べば、渡した関数の引数に 10 が入る。値を配っているのは呼ぶ側なんだ。

渡す側は「何か1つ届く」つもりで引数を1つ書いておけばいいよ。

const useValue = (fn) => {  fn(10);};useValue((n) => {  console.log(n * 3);});

実行結果

30

03 / 05

名前は受け取る側が決める

fn(10)10 がどんな名前で受け取られるかは、渡した関数の書き方しだい。n でも kazu でも動くよ。

決まっているのは順番だけ。1つ目の値が1つ目の引数に入る。だから2つ渡すこともできる。

const useTwo = (fn) => {  fn(4, 5);};useTwo((tate, yoko) => {  console.log(tate * yoko);});

実行結果

20

04 / 05

くり返しながら配る

これで forEach の中身が想像できるようになったはず。配列をまわしながら、要素を1つずつ渡して呼んでいるだけなんだ。

同じものは自分でも作れるよ。下の eachOfforEach の作り方をなぞったものだよ。

const eachOf = (arr, fn) => {  for (let i = 0; i < arr.length; i++) {    fn(arr[i]);  }};eachOf(["あか", "あお"], (c) => {  console.log(c);});

実行結果

あか
あお

05 / 05

戻り値も受け取れる

渡した関数が return した値は、呼んだ側が受け取れる。const answer = fn(6); のように変数に入れるだけだよ。

findfilter が「true を返す関数」を求めていたのも、map が「変換後の値を返す関数」を求めていたのも、これを見ていたからなんだ。

それじゃあ、値を配るコールバックを書いてみよう。

const useResult = (fn) => {  const answer = fn(6);  console.log(`こたえは${answer}`);};useResult((n) => {  return n * n;});

実行結果

こたえは36