自我介绍:大家好,我是吉帅振的网络日志;微信公众号:吉帅振的网络日志;前端开发工程师,工作4年,去过上海、北京,经历创业公司,进过大厂,现在郑州敲代码。
一、高阶函数
1.定义
接收一个或多个函数作为参数,比如filter函数;返回一个函数,比如bind函数。
2.应用
举个例子:比如我们要筛数组[1,2,3,4,5]中大于3的所有元素
//1.普通函数
let newArr = [];
for(let i = 0,len = arr.length; i < len; i++){
arr[i] > 3 && newArr.push(arr[i])
}
//2.使用数组filter方法
let newArr = arr.filter((item) => {return item > 3})
//3.自定义高阶函数
Array.prototype.myFilter = function (fn){
let newArr = [];
for(let i = 0,len = this.length; i < len; i++){
fn(this[i]) && newArr.push(this[i])
}
return newArr;
}
[1,2,3,4,5].myFilter((item) => { return item > 3})
二、组合函数
1.定义
组合函数类似于管道,多个函数的执行时,上一个函数的返回值会自动传入到第二个参数继续执行。
2.应用
举个例子:比如我们要替换一个url中的参数
//1.嵌套方法
function replaceToken(str){
return str.replace(/{token}/g,'123455')
}
function replaceAccount(str){
return str.replace(/{account}/g,'xuriliang')
}
replaceAccount(replaceToken('http://localhost/api/login?token={token}&account={account}'))
//2.组合函数
function compose() {
var args = arguments;
var start = args.length - 1;
return function() {
var i = start;
var result = args[start].apply(this, arguments);
while (i--) result = args[i].call(this, result);
return result;
}
}
compose(replaceToken,replaceAccount)('http://localhost/api/login?token={token}&account={account}')
二、函数柯里化
1.定义
柯里化是将一个多参数的函数转换成多个单参数的函数,这个函数会返回一个函数去处理下一个参数。也就是把fn(a,b,c)转换为newFn(a)(b)(c)这种形象。
2.应用
举个例子:比如我们要拼接接口地址的函数
//1.普通实现
function getUrl(service,context,api){
return service + context + api;
}
let loginUrl = getUrl('http://localhost:8080/','auth','/login')
let logoutUrl = getUrl('http://localhost:8080/','auth','/logout')
//2.函数柯里化
function curry(fn){
let args = Array.prototype.slice.call(arguments,1);
return function(){
let innerArgs = Array.prototype.slice.call(arguments);
let finalArgs = args.concat(innerArgs);
if(finalArgs.length < fn.length){ //fn.length为函数的参数个数
return curry.call(this,fn,...finalArgs)
}else{
return fn.apply(null,finalArgs)
}
}
}
var getAuthUrl = curry(getUrl,'http://localhost:8080/','auth');
let loginUrl = getAuthUrl('/login')
let logoutUrl = getAuthUrl('/logout')