柯里化的概念
柯里化就是预先将函数的某些参数传入,得到 一个简单的函数,但是预先传入的参数被保存在闭包中,因此会有一些奇特的特性。比如:
var adder = function(num){
return function(y){
return num + y;
}
}
var inc = adder(1);
var dec = adder(-1);
这里的 inc/dec 两个变量事实上是两个新的函数,可以通过括号来调用,比如下例中的用法:
//inc, dec现在是两个新的函数,作用是将传入的参数值(+/-)1
console.log(inc(99));//100
console.log(dec(101));//100
console.log(adder(100)(2));//102
console.log(adder(2)(100));//102
柯里化的应用
根据柯里化的特性,我们可以写出更有意思的代码,比如在前端开发中经常会遇到这样 的情况,当请求从服务端返回后,我们需要更新一些特定的页面元素,也就是局部刷新的概 念。使用局部刷新非常简单,但是代码很容易写成一团乱麻。而如果使用柯里化,则可以很 大程度上美化我们的代码,使之更容易维护。我们来看一个例子:
//update会返回一个函数,这个函数可以设置id属性为item的web元素的内容
function update(item) {
return function (text) {
$("div#" + item).html(text);
}
}
//Ajax请求,当成功时调用参数callback
function refresh(url, callback) {
var params = {
type: "echo",
data: ""
};
$.ajax({
type: "post",
url: url,
cache: false,
async: true,
dataType: "json",
data: params,
//当异步请求成功时调用
success: function (data, status) {
callback(data);
},
//当请求出现错误时调用
error: function (err) {
alert("error : " + err);
}
});
}
refresh("action.do?target=news", update("newsPanel"));
refresh("action.do?target=articles", update("articlePanel"));
refresh("action.do?target=pictures", update("picturePanel"));
其中,update 函数即为柯里化的一个实例,它会返回一个函数,即:
update("newsPanel") = function(text){
$("div#newsPanel").html(text);
}
function Add() {
const nums = [...arguments];
function AddPro() {
nums.push(...arguments);
return AddPro;
}
AddPro.sumOf = () => {
return nums.reduce((a, b) => a + b);
}
return AddPro;
}
console.log("🚀 ~ file: add.js ~ line 10 ~ Add(1)(2)(3) ", Add(1, 2, 3)(2)(3)(4)(5).sumOf())