関数が関数を返すという内容です
まず、関数はオブジェクトなので、とても自由自在です。
関数を変数に格納したり、引数に渡したり、色々できちゃうということですね。
そして関数が関数返すということも出来ます。
「関数」だらけで、特に引数がどこに繋がってるのか混乱しますが、一つ一つ見ると意外とシンプルでした。
メソッドの内容:勝ってる動物によって異なる質問をする
名前はペットの名前です。飼い主に聞いてるイメージです。
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?
変数を定義する必要もないです!シンプルですね!
最初はどの引数に対して渡してるのか混乱するかもですが、慣れればとても便利そうです。