JavaScript関数式プログラミング(Functional Programming)高次関数(Higher order functions)用法分析

2585 ワード

この例では、JavaScript関数式プログラミング(Functional Programming)高次関数(Higher order functions)の使い方について説明します.皆さんの参考にしてください.具体的には以下の通りです.
高次関数(higher-order functions)は、他の関数の関数を返すか、他の関数をそのパラメータとして使用する関数です.
パラメータとして関数を使用
関数自体が値であるため、関数をパラメータとして他の関数に渡すことができます.JavaScriptでは、Arrayなどの関数タイプのパラメータを使用する必要がある関数があります.map.
たとえば、データのセットがあります.

const names = ['  ', '  ', '   ']


このデータの各項目にそれぞれ挨拶します.

const greetings = names.map(function(name) {
 return `hi ~ ${name}`
})
console.log(greetings)
// ["hi ~   ", "hi ~   ", "hi ~    "]


上のmap法では匿名関数をそのパラメータとして用いた.この関数では、配列の各項目の前に「hi~」を追加し、mapは新しい配列を返します.この配列はgreetings変数に渡しました.
矢印関数を使用すると、より簡潔になります.

const greetings = names.map(name => `hi ~ ${name}`)


高次関数
高次関数(higher-order functions).JavaScriptでは、関数は普通のオブジェクトとあまり変わらないので、関数をパラメータとして他の関数に渡すことができます.関数に関数を返すこともできます.パラメータの関数として関数を使用するか、高次関数(higher-order functions)と呼ばれる関数を返します.
例えば、さっき使ったmapは高次関数です.関数をパラメータとして使うからです.
もう1つの例を見てみましょう.

const robot = (name, action) => {
 return action(name)
}
const greet = (name) => {
 return `hello, ${name}`
}
const greeting = robot('    ', greet)
//    “ hello,    ”


robotは2つのパラメータ、nameとactionをサポートする関数で、ここでのactionパラメータのタイプは1つの関数です.robotでactionを返し,nameパラメータの値をactionに渡した.次にgreetという関数を定義します.パラメータがnameであることを受け入れます.この関数は文字列を返します.
次にrobotという関数を使って、その2つのパラメータの値を設定しました.nameパラメータの値は「こんにちは」で、actionパラメータの値は私たちが定義したgreetという関数です.実行結果は次のとおりです.
ハロー、こんにちは
関数を定義してみましょう.

const goodbye = (name) => {
 return `bye, ${name}`
}


次にrobot関数を使用します.

const byeBye = robot('    ', goodbye)


今回は、
byeさん、こんにちは
完全な例:

const robot = (name, action) => {
 return action(name)
}
const greet = (name) => {
 return `hello, ${name}`
}
const greeting = robot('    ', greet)
console.log(greeting)
const goodbye = (name) => {
 return `bye, ${name}`
}
const byeBye = robot('    ', goodbye)
console.log(byeBye)


JavaScriptに関する詳細は、「JavaScript常用関数テクニック要約」、「javascriptオブジェクト向け入門チュートリアル」、「JavaScriptエラーとデバッグテクニックまとめ」、「JavaScriptデータ構造とアルゴリズムテクニックまとめ」、「JavaScript数学演算使い方まとめ」のトピックを参照してください.
JavaScriptプログラムの設計に役立つことを願っています.