高阶函数

  1. function test(a, b, fn) {
  2. return fn(a) + fn(b);
  3. }
  4. function square(x) {
  5. return Math.pow(x, 2);
  6. }
  7. console.log(test(2, 3, square)); //13
  8. function test2(a, b, pow) {
  9. return pow(a, 2) + pow(b, 2);
  10. }
  11. function pow(x, n) {
  12. return Math.pow(x, n);
  13. }
  14. var res = test2(2, 3, pow);
  15. console.log(res); //13

JS函数实际上都是指向某一个变量 无论是函数表达式 还是函数声明的形式
var test = function (a,b) { }
function test() { }

    test -> 一个函数<br />        函数参数 -> 接收变量<br />        函数的参数能接收变量<br />        一个函数就可以接收另一个函数作为变量

    **一个函数接收另一个函数作为参数变量的这个函数就是高阶函数**

demo

        // map() -> 数据处理函数 -> 高阶函数
        // reduce() -> 归纳函数 -> 高阶函数

        var arr = [1, 2, 3, 4, 5];
        function addOne(elem) {
            return elem + 1;
        }
        var newArr = arr.map(addOne);

        function setData(initVal, elem) {
            if (elem > 3) {
                initVal.push(elem);
            }
            return initVal;
        }
        var newArr = arr.reduce(setData, []);
        console.log(newArr);

高阶函数
数组的扩展方法
计时器
sort
replace

        var test = function (fn) {
            return doSth(function (data) {
                return fn(data);
            });
        }

        function doSth(fn) {
            fn();
        }

        // fn(data) -> function (data) {return fn(data)}()

        // var test = function (fn) {
        //     return doSth(fn(data));
        // }

        // var test = function (fn) {
        //     fn(data);
        // }
        var test = fn(data);

柯里化 函数式编程的思想

    在计算机科学中,柯里化把接收多个参数的函数编程接受一个单一的参数(最初函数的第一个参数)的函数,并且返回接收余下的参数且返回结果的新函数的技术

1、简化代码
2、提高维护性
3、功能单一化

    功能内聚<br />        降低耦合<br />        降低代码的重复性<br />        提高代码的适应性
        function curry(fn, len) {
            var len = len || fn.length;
            var func = function (fn) {
                var _arg = [].slice.call(arguments, 1);
                return function () {
                    var newArgs = _arg.concat([].slice.call(arguments));
                    return fn.apply(this, newArgs);
                }
            }
            return function () {
                var argLen = arguments.length;
                if (argLen < len) {
                    var formatedArr = [fn].concat([].slice.call(arguments));
                    return curry(func.apply(this, formatedArr), len - argLen);
                }
                else {
                    return fn.apply(this, arguments);
                }
            }
        }
            //demo1
        function add(a, b, c, d) {
            return a + b + c + d;
        }
        var add2 = curry(add);

        var res = add2(1)(2)(3)(4); //10
        //demo2
                function ajaxRequest(opt, data, sCB, eCB) {
            $.ajax({
                url: opt.url,
                type: opt.type,
                dataType: opt.dataType,
                data: data,
                success: sCB,
                error: eCB
            });
        }
        var $ajax = curry(ajaxRequest);
        var ajaxApi = {
            getCourses: $ajax({
                url: 'http://study.jsplusplus.com/Index/getCourses',
                type: 'POST',
                dataType: 'JSON'
            })
        }
        ajaxApi.getCourses({
            page: 1,
        })
            (function (data) {
                console.log(data);
            })
            (function () {
                console.log('ERROR');
            })