柯里化的概念
柯里化就是预先将函数的某些参数传入,得到 一个简单的函数,但是预先传入的参数被保存在闭包中,因此会有一些奇特的特性。比如:
var adder = function(num){return function(y){return num + y;}}var inc = adder(1);var dec = adder(-1);
这里的 inc/dec 两个变量事实上是两个新的函数,可以通过括号来调用,比如下例中的用法:
//inc, dec现在是两个新的函数,作用是将传入的参数值(+/-)1console.log(inc(99));//100console.log(dec(101));//100console.log(adder(100)(2));//102console.log(adder(2)(100));//102
柯里化的应用
根据柯里化的特性,我们可以写出更有意思的代码,比如在前端开发中经常会遇到这样 的情况,当请求从服务端返回后,我们需要更新一些特定的页面元素,也就是局部刷新的概 念。使用局部刷新非常简单,但是代码很容易写成一团乱麻。而如果使用柯里化,则可以很 大程度上美化我们的代码,使之更容易维护。我们来看一个例子:
//update会返回一个函数,这个函数可以设置id属性为item的web元素的内容function update(item) {return function (text) {$("div#" + item).html(text);}}//Ajax请求,当成功时调用参数callbackfunction 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())
