什么是函数柯里化?
把接收多个参数的函数转换为接收单个参数的函数,嵌套返回并使用所有的参数,最终返回结果值。
函数柯里化有什么用?或者说有什么好处?
- 参数复用 下面示例实现了正则表达式的复用,不用每次都传入正则和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