柯里化的概念

柯里化就是预先将函数的某些参数传入,得到 一个简单的函数,但是预先传入的参数被保存在闭包中,因此会有一些奇特的特性。比如:

  1. var adder = function(num){
  2. return function(y){
  3. return num + y;
  4. }
  5. }
  6. var inc = adder(1);
  7. var dec = adder(-1);

这里的 inc/dec 两个变量事实上是两个新的函数,可以通过括号来调用,比如下例中的用法:

  1. //inc, dec现在是两个新的函数,作用是将传入的参数值(+/-)1
  2. console.log(inc(99));//100
  3. console.log(dec(101));//100
  4. console.log(adder(100)(2));//102
  5. console.log(adder(2)(100));//102

柯里化的应用

根据柯里化的特性,我们可以写出更有意思的代码,比如在前端开发中经常会遇到这样 的情况,当请求从服务端返回后,我们需要更新一些特定的页面元素,也就是局部刷新的概 念。使用局部刷新非常简单,但是代码很容易写成一团乱麻。而如果使用柯里化,则可以很 大程度上美化我们的代码,使之更容易维护。我们来看一个例子:

  1. //update会返回一个函数,这个函数可以设置id属性为item的web元素的内容
  2. function update(item) {
  3. return function (text) {
  4. $("div#" + item).html(text);
  5. }
  6. }
  7. //Ajax请求,当成功时调用参数callback
  8. function refresh(url, callback) {
  9. var params = {
  10. type: "echo",
  11. data: ""
  12. };
  13. $.ajax({
  14. type: "post",
  15. url: url,
  16. cache: false,
  17. async: true,
  18. dataType: "json",
  19. data: params,
  20. //当异步请求成功时调用
  21. success: function (data, status) {
  22. callback(data);
  23. },
  24. //当请求出现错误时调用
  25. error: function (err) {
  26. alert("error : " + err);
  27. }
  28. });
  29. }
  30. refresh("action.do?target=news", update("newsPanel"));
  31. refresh("action.do?target=articles", update("articlePanel"));
  32. refresh("action.do?target=pictures", update("picturePanel"));

其中,update 函数即为柯里化的一个实例,它会返回一个函数,即:

  1. update("newsPanel") = function(text){
  2. $("div#newsPanel").html(text);
  3. }
  1. function Add() {
  2. const nums = [...arguments];
  3. function AddPro() {
  4. nums.push(...arguments);
  5. return AddPro;
  6. }
  7. AddPro.sumOf = () => {
  8. return nums.reduce((a, b) => a + b);
  9. }
  10. return AddPro;
  11. }
  12. console.log("🚀 ~ file: add.js ~ line 10 ~ Add(1)(2)(3) ", Add(1, 2, 3)(2)(3)(4)(5).sumOf())