什么函数科里化?
科里化(currying)又称部分求值,是高阶函数;它将一个接收多参数的函数转化为接收部分参数的函数。柯里化后的函数只传递部分参数来调用,并返回一个新的函数 去处理剩余的参数,是逐步传参的过程。科里化不会调用函数,只是函数的转换;为什么这样说?科里化是将函数fn(a, b, c)转换成了fu(a)(b)(c);
科里化的目的是什么?
个人觉得,主要目的是减少代码冗余,以及增加代码的可读性,还可以用于优化比较耗时的计算,通过将计算结果缓存到内存中(闭包)。
看一个例子:
let tags = ["div", "span", "a", "img"];
function curry(tags) {
let set = {};
tags.map((key) => {
set[key] = true;
});
return (tagName) => {
return !!set[tagName];
};
}
let isHtmlTags = curry(tags);
console.log(isHtmlTags("div")); // true
console.log(isHtmlTags("span")); // true
console.log(isHtmlTags("b")); // false
假如有十个标签,只执行了一次下面的循环。
tags.map((key) => {
set[key] = true;
});
如果不使用科里化,每次调用都会执行一次循环,此外,每次都要传入tags,不要好奇为什么不把tags定义在函数里面,这是为了复用,现在是 tags = ["div", "span", "a", "img"];在其他地方可能就是 nums = [1, 2, 3];
let tags = ["div", "span", "a", "img"];
function checkHtmlTag(tags, tagsName) {
if (tags.indexOf(tagsName) > -1) {
return true;
} else {
return false;
}
}
let isHtmlTagsDiv = checkHtmlTag(tags, "div");
let isHtmlTagsSpan = checkHtmlTag(tags, "span");
let isHtmlTagsB = checkHtmlTag(tags, "b");
console.log(isHtmlTagsDiv); // true
console.log(isHtmlTagsSpan); // true
console.log(isHtmlTagsB); // false