认识函数式编程
函数式编程,缩写 FP,是一种编程风格,与面向对象、面向过程等编程范式并列。
函数式编程中的函数不是 function,而是 Y 与 X 的关系这一数学层面中的函数关系。
————相同的输入始终都等于相同的输出。
函数式编程用来描述(函数)之间的映射。
例:
//非函数式
let num1 = 1;
let num2 = 2;
let sum = num1 + num2;
console.log(sum);
//函数式
function add(num1, num2) {
return num1 + num2;
}
let sum = add(2, 3)
console.log(sum);
1、函数是一等公民:函数可以储存在变量中、可以作为参数、可以作为返回值。
//示例
const Control = {
index(post){return View.index(post)},
show(post){return View.show(post)},
create(post){return View.create(post)},
}
//优化
const Control = {
index: View.index,
show: View.show,
create: View.create,
}
2、高阶函数
我们可以把函数作为参数传递给另一个函数。
function forEach(array, fn) {
for (let i = 0; i < array.length; i++) {
fn(array[i])
}
}
// 测试
// let arr = [1, 3, 4, 7, 8]
// forEach(arr, function (item) {
// console.log(item)
// })
function filter(array, fn) {
let results = []
for (let i = 0; i < array.length; i++) {
if (fn(array[i])) {
results.push(array[i])
}
}
return results
}
// 测试
// let arr = [1, 3, 4, 7, 8]
// let r = filter(arr, function (item) {
// return item % 2 === 0
// })
// console.log(r)
我们也可以把函数作为另一个参数的返回结果。
// 高阶函数-函数作为返回值
function makeFn () {
let msg = 'Hello function'
return function () {
console.log(msg)
}
}
const fn = makeFn()
//测试
// fn()
// makeFn()()
// once
function once(fn) {
let done = false
return function () {
if (!done) {
done = true
return fn.apply({}, arguments)
}
}
}
let pay = once(function (money) {
console.log(`支付: ${money} RMB`)
})
//测试
// pay(5)
// pay(5)
// pay(5)
常用的高阶函数。
// map
const map = (array, fn) => {
let results = []
for (let value of array) {
results.push(fn(value))
}
return results
}
// 测试
// let arr = [1, 2, 3, 4]
// arr = map(arr, v => v * v)
// console.log(arr)
// every
const every = (array, fn) => {
let result = true
for (let value of array) {
result = fn(value)
if (!result) {
break
}
}
return result
}
// 测试
// let arr = [9, 12, 14]
// let r = every(arr, v => v > 10)
// console.log(r)
// some
const some = (array, fn) => {
let result = false
for (let value of array) {
result = fn(value)
if (result) {
break
}
}
return result
}
// 测试
// let arr = [1, 3, 5, 9]
// let r = some(arr, v => v % 2 === 0)
// console.log(r)
网友评论