一等公民函数
特点
一个函数要调用的的参数与返回后的函数中需要调用的参数相同或者一个函数要调用的参数是函数并且在返回的函数中进行调用——可以直接调用返回函数
//一个函数要调用的的参数与返回后的函数中需求调用的参数一直
ajaxCall(json => callback(json));
// 等价于这行
ajaxCall(callback);
//一个函数要调用的参数是函数并且在返回的函数中进行调用
const getServerStuff = callback => ajaxCall(json => callback(json));
// 等价于这行
const getServerStuff = ajaxCall;
示例:
function pow(x) {
return x * x;
}
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var results = arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81]
console.log(results);
纯函数
特点
相同的输入,永远会得到相同的输出
纯函数(不改变原有数据结构)
let arr=[1,2,3,4,5]
arr.slice(0,3) //[1,2,3]
arr.slice(0,3) //[1,2,3]
arr.slice(0,3) //[1,2,3]
不纯函数(原有的数据结构发送变化)
arr.splice(0,1)//[1]
arr.splice(0,1)//[2]
arr.splice(0,1)//[3]
高价函数
特点
a.将函数作为参数(模拟数组一些方法)
function foreach(arr, fn) {
for (let index = 0; index < arr.length; index++) {
fn(arr[index])
}
}
function filter(arr, fn) {
let result = []
for (let index = 0; index < arr.length; index++) {
if (fn(arr[index])) {
result.push(arr[index])
}
}
return result
}
function map(arr, fn) {
let result = []
for (let index = 0; index < arr.length; index++) {
result.push(fn(arr[index]))
}
return result
}
let arr = [1, 3, 4, 6, 7, 8, 9]
foreach(arr, function (num) {
console.log(num)
})
filter(arr, function (num) {
return num % 2 === 0
})
map(arr, num => num * num * num)
b.将函数作为返回值
简单:
function makeFn () {
let msg = 'Hello function'
return function () {
console.log(msg)
}
}
const fn = makeFn()
fn()
makeFn()()
复杂:
模拟只能调用一次
function once(fn) {
let flag = false;
return function() {
if (!flag) {
flag = true
return fn.apply(fn, arguments)
}
}
}
let p = once(function(num) {
console.log(num)
})
p(5)
// 执行过程 1.p执行once()函数 flag=false 返回一个函数 function(){if (!flag) {flag = true return fn.apply(fn, arguments)}}
// 2.(5)调用第一步返回的函数 判断flag flag=true 返回一个函数 fn即function(num) { console.log(num)}
// 3.fn.apply(fn,5)调用第二步返回函数=>5