函数柯里化

362 阅读1分钟

什么是函数柯里化?

把接收多个参数的函数转换为接收单个参数的函数,嵌套返回并使用所有的参数,最终返回结果值。

函数柯里化有什么用?或者说有什么好处?

  • 参数复用 下面示例实现了正则表达式的复用,不用每次都传入正则和str参数,做到了参数复用。
function myTest(reg) {
    return function(str) {
        return reg.test(str);
    }
}
var test = myTest(/\d/g);
var res1 = test('123');
var res2 = test('sadads');
var res3 = test('1d2ds3');
  • 延迟计算
  • 动态生成函数
const addEvent = (function() {
	if (window.addEventListener) {
		return function(ele) {
			return function(type) {
				return function(fn) {
					return function(capture) {
						ele.addEventListener(type, (e) => fn.call(ele, e), capture);
					}
				}
			}
		}
	} else if (window.attachEvent) {
		return function(ele) {
			return function(type) {
				return function(fn) {
					return function(capture) {
						ele.addEventListener(type, (e) => fn.call(ele, e), capture);
					}
				}
			}
		}
	}
})();

// 调用
addEvent(document.getElementById('app'))('click')((e) => {console.log('click function has been call:', e);})(false);

// 分步骤调用会更加清晰
const ele = document.getElementById('app');
// get environment
const environment = addEvent(ele)
// bind event
environment('click')((e) => {console.log(e)})(false);

怎么实现,怎么将一个函数转为柯里化?

function curry(fn) {
    return function nest(...args1) {
        // fn.length指的是函数fn的参数一共有多少个
        if (fn.length === args1.length) {
            return fn(...args1);
        }else {
            // 收集参数
            return function(arg) {
                return nest(...args1, arg);
            }
        }
    }

}

function addNum(a, b, c) {
    return a + b + c;
}

const addCurry = curry(addNum);

addCurry(1)(2)(3);// 6