JS中的函数柯里化

1. 概念

”函数柯里化”是指将多变量函数拆解为单变量的多个函数的依次调用, 可以从高元函数动态地生成批量的低元的函数。

简单讲:就是利用函数执行,可以形成一个不销毁的私有作用域,把预先处理的内容都存在这个不销毁的作用域里面,

              并且返回一个函数,以后要执行的就是这个函数。


举个栗子:

// 常规的add函数
function add(x, y) {
    return x + y
}

// Currying后
function curryingAdd(x) {
    return function (y) {
        return x + y
    }
}

add(1, 2)           // 3
curryingAdd(1)(2)   // 3

在柯里化后,将函数的一个参数拆分为两个乃至更多参数

2. 用途

2.1 参数复用
// 正常正则验证字符串 reg.test(txt)

// 函数封装后
function check(reg, txt) {
    return reg.test(txt)
}

check(/d+/g, 'test')       //false
check(/[a-z]+/g, 'test')    //true

// Currying后
function curryingCheck(reg) {
    return function(txt) {
        return reg.test(txt)
    }
}

var hasNumber = curryingCheck(/d+/g)
var hasString = curryingCheck(/[a-z]+/g)

hasNumber('test1')      // true
hasNumber('testtest')   // false
hasString('21212')      // false

对于正则的校验,如果有很多地方都要校验是否有数字,我们只需要将第一个参数reg进行复用,

这样别的地方就能够直接调用hasNumber,hasString等函数,让参数能够复用。

2.2 提前返回
//把isSupport这个参数给先确定下来
var on = function(element, event, handler) {
    if (document.addEventListener) {
        if (element && event && handler) {
            element.addEventListener(event, handler, false);
        }
    } else {
        if (element && event && handler) {
            element.attachEvent('on' + event, handler);
        }
    }
}

var on = (function() {
    if (document.addEventListener) {
        return function(element, event, handler) {
            if (element && event && handler) {
                element.addEventListener(event, handler, false);
            }
        };
    } else {
        return function(element, event, handler) {
            if (element && event && handler) {
                element.attachEvent('on' + event, handler);
            }
        };
    }
})();

//后一种方法
var on = function(isSupport, element, event, handler) {
    isSupport = isSupport || document.addEventListener;
    if (isSupport) {
        return element.addEventListener(event, handler, false);
    } else {
        return element.attachEvent('on' + event, handler);
    }
}

后一种方法可以避免每次都进行判断,提前确定了哪一种方法,提前返回。

2.3 延迟运行

bind函数实现机制就是柯里化的封装

Function.prototype.bind = function (context) {
    var _this = this
    var args = Array.prototype.slice.call(arguments, 1)
 
    return function() {
        return _this.apply(context, args)
    }
}

延迟执行,在没有输入参数时,不计算总结果。等需要计算的时候,再计算。

本文引自:https://blog.csdn.net/aaaaa1994/article/details/94359366

原文地址:https://www.cnblogs.com/ggll611928/p/13266576.html