LESSON 22 ・ 関数
高階関数
関数を引数に渡す
function square(x) {
return x * x;
}
let a = twice(square, 3);
console.log(a);
関数の引数に関数を渡すこともできます。
たとえば、同じ関数を2回繰り返して実行する関数twiceを考えます。そうすると、twiceに繰り返したい関数squareを渡したくなるはずです。これが、関数に関数を渡すという意味です。
上記の例では、まずsquare(3)で3 * 3が実行されて9が得られ、さらにsquare(9)で9 * 9が実行されて81が得られます。
このように、関数を引数として受け取る、または関数を戻り値として返す関数を高階関数(こうかいかんすう, higher-order function)と言います。
高階関数を実装する
function twice(f, x) {
let y = f(x);
let z = f(y);
return z;
}
function square(x) {
return x * x;
}
let a = twice(square, 3);
console.log(a);
関数twiceはこのように実装できます。
function twice(f, x) {
return f(f(x));
}
function square(x) {
return x * x;
}
let a = twice(square, 3);
console.log(a);
より簡潔に書くこともできます。
PRACTICE
演習問題
コードを自分で書いて実行してから、答えと解説を確認しましょう。
問題1
受け取った関数を2回適用する高階関数twiceと、整数を2乗する関数squareを定義してください。twice(square, 3)の結果を表示してください。
答えと解説を見る
模範解答
function twice(f, x) {
return f(f(x));
}
function square(x) {
return x * x;
}
console.log(twice(square, 3));
twiceは関数fを引数として受け取り、その関数を2回呼び出します。3を2乗した9がもう一度2乗されるため、81が表示されます。
問題2
受け取った整数を1増やす関数addOneと、受け取った関数を2回適用する高階関数twiceを定義してください。twice(addOne, 3)の結果を表示してください。
答えと解説を見る
模範解答
function twice(f, x) {
return f(f(x));
}
function addOne(x) {
return x + 1;
}
console.log(twice(addOne, 3));
最初のaddOneで3が4になり、次のaddOneで5になります。関数を引数として渡すことで、twiceは異なる関数にも使えます。
問題3
受け取った関数を3回適用する高階関数thriceを定義してください。addOneを渡して、thrice(addOne, 10)の結果を表示してください。
答えと解説を見る
模範解答
function thrice(f, x) {
return f(f(f(x)));
}
function addOne(x) {
return x + 1;
}
console.log(thrice(addOne, 10));
fの戻り値を次のfへ渡す処理を3回重ねます。10に1が3回足され、13が表示されます。