什么是高阶函数

至多满足以下一个条件的函数

  1. 函数作为参数进行传递
  2. 函数作为返回值输入

函数作为参数传递例子:

1、回调函数

作用:能够抽离出一部分容易变动的业务逻辑,把这部分业务逻辑放在函数参数中,这样一来能够拆散业务代码中变动与不变的局部

1、ajax异步申请利用

例子:

 var getUserInfo = function (userId, callback) {            let url = "https://geoapi.qweather.com/v2/city/lookup?key=eb04b1545b06437486b293fd1f23edd8&location=" + userId            $.ajax({                url: url, complete: function (data) {                    if (callback instanceof Function) {                        callback();                        console.log("胜利获取数据" + data)                    }                }            })        }        getUserInfo("beijing", function () {            console.log("请查收北京天气数据")        })

2、Array.prototype.sort

      let arrs = [1, 5, 7, 2, 8];        console.log(arrs)        arrs.sort(function (a, b) {            return a - b;        })        console.log(arrs)        arrs.sort(function (a, b) {            return b - a;        })        console.log(arrs)

函数作为返回值输入例子:

1、数据类型判断

    var Type = {};        for (var i = 0, typeArrs; typeArrs = ["Array", "Object", "Number", "String"][i++];) {            (function (type) {                Type["is" + type] = function (obj) {                    return Object.prototype.toString.call(obj) === '[object ' + type + ']'                }            })(typeArrs)        }        console.log(Type.isArray([12, 13]));        console.log(Type.isNumber([12, 13]));

2、单例

  var getSingle = function (fn) {            debugger            var ret;            return function () {                ret || (ret = fn.apply(this, arguments))                console.log(ret);            }        }        var getScript = getSingle(function(){            return document.createElement('scripe')        })        var script1 = getScript()        var script2 = getScript()        alert(script1===script2)

高阶函数实现AOP

AOP概念:
(面向切面编程)次要作用是把跟外围逻辑无关的业务剥离进去,跟逻辑无关的性能通常蕴含:日志统计、安全控制、异样解决等。
益处:1、放弃业务逻辑模块的污浊和高内聚合,2、能够很不便的复用日志统计等模块
实现:

    Function.prototype.before = function(beforefn){            var _self = this;//保留原函数的援用            return function(){//返回蕴含了新函数和原函数的代理函数                beforefn.apply(this,arguments);//执行新函数,修改this                return _self.apply(this,arguments)//执行原函数            }        }        Function.prototype.after = function(afterfn){            var _self = this;            return function(){                var ret = _self.apply(this,arguments);                afterfn.apply(this,arguments);                return ret            }        }        var func = function(){            debugger            console.log(2)        }        // before函数返回一个函数,取决于调用它的函数        func =  func.before(function(){            console.log(1);         }).after(function(){            console.log(3)        })        func();

高级函数的其余利用

1、柯里化

概念:依据传进来的参数决定什么时候执行,当参数满足规定在执行。
案例:计算每个月生产状况,每天开销不做计算,月底在计算整个月的生产总额。

  var currying = function(fn){            var costs = [];            return function(){                if(arguments.length===0){                    // 计算数组的合                    fn.apply(this,costs);                }else{                    [].push.apply(costs,arguments);                    return arguments.callee                    // console.log(costs);                }            }        }        var  cost = (function(){            var money = 0            return function(){                let args = arguments                for(let i = 0;i<args.length;i++){                   money += args[i]                }                return money;            }        })();        var costfunc = currying(cost); //转化成柯里化函数        costfunc(100);//不计算求值        costfunc(500);        costfunc();//计算求值