関数と関数式プログラミング
22610 ワード
高次関数
関数は値として扱われ、変数に格納され、引数として渡されたり、他の関数の結果として返されたりすることができます.
result = [0, 1, 4].map(Math.sqrt) // [0, 1, 2]
map法のように,他の関数を消費する方法を高次関数(higher−order function)と呼ぶ.矢印関数
オブジェクトのテキストを返す矢印関数は、オブジェクトをカッコで囲む必要があります.そうでない場合は、中かっこをblockと認識します.
const stats = (x, y) => ({
average: (x + y) / 2,
distance: Math.abs(x -y)
})
かんすうはいれつしょり
foreachメソッドは結果を返さないため、foreachに渡される関数には副作用が含まれる必要があります.
arr.forEach((element, index) => { console.log(`${index}: ${element}`) })
map、filter、joinメソッドは値を返さないか、副作用を生じません.const enclose = (tag, contents) => `<${tag}$>{contents}</${tag}>`
const listitems = item.map(i=> enclose('li', i))
エンクロージャ
const sayLater (text, when) => {
let task = () => console.log(text)
setTimeout(task, when)
}
sayLater('Hello', 1000)
sayLater('Goodbye', 1000)
関数は1です.コードブロック、2.パラメータ自由変数free variable(パラメータまたは領域変数として宣言されていない他の変数)から構成されます.自由変数を含む関数を閉パッケージと呼びます.
let text = 'Goodbye'
setTimeout(() => console.log(text), 1000)
text = 'Hello'
/// Hello
ハードオブジェクト
ハードオブジェクトhard object=モジュールモード=ファクトリクラスモード
const createAccount = (initialBalance) => {
let balance = initialBalance + 10
return {
deposit: (amount) => {
balance += amount
},
withdraw: (amount) => {
if (balance >= amount) balance -= amount
},
getBalance: () => balance
}
}
厳格モード
'use strict'
すべての変数を宣言NaN、undefinedに値を割り当てることはできません
スクリプトまたは関数の最上位レベルでのみ関数を宣言
有効な識別子でのみdelete演算を使用
パラメータの繰り返し不可
パラメータタイプの確認
タイプチェック文字列タイプx==="string"|x instanceof String正規表現x instanceofRegExp数値タイプx===="number"|x instanceofNumber数値変換可能なすべてのフォーマットタイプ+x==="number"配列Array.isArray(x)関数タイプx="function"
既定のパラメータ
const average = (x=0, y=x) => (x+y)/2
残りのパラメータとスプレッドシート演算子
let numbers = [1, 2, 3, 4]
Math.max(...numbers) // 스프레드 연산자
const [first, ... others] = numbers // 나머지 매개변수 선언
非構造化で命名されたパラメータの模倣
JAvascriptではパラメータの名前付けはサポートされていませんが、オブジェクト文字を使用して模倣できます.
const mkString = (array, {
separator = ',',
leftDelimiter = '[',
rightDelimiter = ']'
} = {}) => {
...
}
がんばって
JAvascriptのすべての宣言が範囲の最上位に引き上げられました
厳格なモードでvarを使用しないと、反発によるエラーの可能性が大幅に減少します.
以前は、関数番号ルールを使用して範囲を制限していました.
(function () {
var someVariable = 33
function someFunction(...) { ... }
...
})() // () 를 이용해 여기서 함수호출
// somevariable, someFunction 은 더 이상 범위에 없음
最近では、匿名関数を以下のように簡単に宣言し、範囲は「許容範囲内」に制限されています.{
let someVariable = 33
const someFunction = (...) => { ... }
...
}
例外
関数が結果を計算できない場合は、NaNまたはundefinedを使用することが望ましい.
finallyセクションは実行する必要があります.return/break/throwを追加すると混乱します.
try {
// 작업처리
} catch (e) {
console.log(e)
throw e
} finally {
// 자원해제등 작업
...
}
練習問題
function indexOf(arr, value) {
for (let i in arr ) {
if (arr[i] === value) return i
}
return -1
}
indexOf({'prop1':3, prop2:4}, 3) // 'prop1'
indexOf({'prop1':3, prop2:4}, 1) // -1
// 양의 정수 내림차순
[1, 3, 5, 6].sort((x,y) => y - x )
// 사람을 연령 오름차순
[{'name':'john', 'age': 11}, {'name':'petti', 'age': 13}, {'name':'merian', 'age': 10}].sort((x,y) => x.age - y.age )
// 문자열 오름차순
['abc', 'bcde', 'abcd', 'abc'].sort()
// 문자열 내림차순
['abc', 'bcde', 'abcd', 'abc'].sort((x,y) => x > y ? -1 : (x < y ? 1 : 0))
Reference
この問題について(関数と関数式プログラミング), 我々は、より多くの情報をここで見つけました https://velog.io/@ged/함수와-함수형-프로그래밍テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol