函数柯里化详解

╄→尐↘猪︶ㄣ 提交于 2020-07-27 21:52:13

函数柯里化详解

在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。

经典面试题:

// 实现一个add方法,使计算结果能够满足如下预期:
add(1)(2)(3) = 6;
add(1, 2, 3)(4) = 10;
add(1)(2)(3)(4)(5) = 15;

function add() {
    // 第一次执行时,定义一个数组专门用来存储所有的参数
    var _args = Array.prototype.slice.call(arguments);

    // 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
    var _adder = function() {
        _args.push(...arguments);
        return _adder;
    };

    // 利用toString隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
    _adder.toString = function () {
        return _args.reduce(function (a, b) {
            return a + b;
        });
    }
    return _adder;
}

或
 function add() {
        // 第一次执行时,定义一个数组专门用来存储所有的参数
        var _args = [].slice.call(arguments);
        // 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值,执行时已经收集所有参数为数组
        var adder = function () {
            var _adder = function () {
                // 执行收集动作,每次传入的参数都累加到原参数
                [].push.apply(_args, [].slice.call(arguments));
                return _adder;
            };
            // 利用隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
            _adder.toString = function () {
                return _args.reduce(function (a, b) {
                    return a + b;
                });
            }
            return _adder;
        }
        return adder(_args);
    }



add(1)(2)(3)                // 6
add(1, 2, 3)(4)             // 10
add(1)(2)(3)(4)(5)          // 15
add(2, 6)(1)                // 9

防抖函数

   function debounce(fn, delay) {
        var timer;
        return function () {
            var that = this, innerArgs = [].slice.call(arguments);
            clearTimeout(timer);
            timer = setTimeout(function () {
                fn.apply(that, innerArgs);
            }, delay)
        }
    };
    window.onscroll = debounce(function () {
        console.log('滚动了')
    }, 100)

函数节流

    function throtte(fn, delay) {
        var prevTime = +new Date();
        return function () {
            var curTime = +new Date();
            if (curTime - prevTime > delay) {
                fn.apply(this, arguments);
                prevTime = curTime;
            }
        }
    };
    var throtteScroll = throtte(function () {
        console.log(111)
    }, 500);
    window.onscroll = throtteScroll;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!