LoginSignup
1
0

More than 3 years have passed since last update.

Functions returning functionsを理解する

Last updated at Posted at 2020-08-13

関数が関数を返すという内容です

まず、関数はオブジェクトなので、とても自由自在です。
関数を変数に格納したり、引数に渡したり、色々できちゃうということですね。

そして関数が関数返すということも出来ます。

「関数」だらけで、特に引数がどこに繋がってるのか混乱しますが、一つ一つ見ると意外とシンプルでした。

メソッドの内容:勝ってる動物によって異なる質問をする
名前はペットの名前です。飼い主に聞いてるイメージです。

function animalQuestion(animal) { //引数をanimalとしておきます
  if (animal === 'dog') { 
    return function(name) { //もし犬だったらconsoleにこの質問を表示
      console.log('How often do you walk for ' + name + ' ?');
    }
  } else if (animal === 'cat') {
    return function(name) { //もし猫だったらconsoleにこの質問を表示
      console.log('How many hours is ' + name + ' in outside?');
    }
  } else {
    return function(name) { //その他
      console.log('What does ' + name + ' like to do ?');
    }
  }
}

returnする関数は無名関数です。英語だとanonymous function。
その無名関数には name という引数を渡します。今回の場合はペットの名前に該当します。

var dogQuestion = animalQuestion('dog');
dogQuestion('Taro'); //結果: How often do you walk for Taro?

var catQuestion = animalQuestion('cat');
catQuestion('Maron'); //結果: How many hours is Maron in outside?

次に、動物がdogの場合の変数を定義し、そこにanimalQuestionを代入します。
その際、animalQuestionの引数に dog を与えます。(ifを機能させる為)
そのあと、定義したdogQuestionを呼び出すわけですが、既にanimalQuestionの関数が入ってます。
なのであとは returnする関数の name の部分に引数を与えるだけです。

dogQuestion('Ziro'); //結果: How often do you walk for Ziro ?
catQuestion('Momo'); //結果: How many hours is Momo in outside?
catQuestion('Koko'); //結果; How many hours is Koko in outside?

名前を変えるだけで、こんな感じになります。

もっとシンプルな呼び出し方があります。↓

animalQuestion('dog')('Taro'); //結果: How often do you walk for Taro?
animalQuestion('cat')('Maron'); //結果: How many hours is Maron in outside?

変数を定義する必要もないです!シンプルですね!

最初はどの引数に対して渡してるのか混乱するかもですが、慣れればとても便利そうです。

1
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
1
0