javascript中函数柯里化解析

闭包和柯里化都是javascript经常用到而且比较高级的技巧,所有的函数式编程语言都支持这两个概念,因此,我们想要充分发挥出javascript中的函数式编程特征,就需要深入的了解这些概念。

一、柯里化的概念

在计算机科学中,柯里化是把接收多个参数的函数变换成接收一个单一参数(最初函数的第一个参数)的函数,并且返回接收余下的参数且返回结果的新函数的技术。

接下来看一下简单实例

var sum = function(num){
    return function(y){
        return num + y;
    }
}
var inc = sum(1);
var dec = sum(-1);
//这里的inc/dec两个变量实际是两个新的函数,可以通关过括号来调用。
console.log(inc(99)); //100
console.log(dec(101); //100
console.log(sum(100)(2)); //102
console.log(sum(2)(100)); //102
//这样就很容易理解

柯里化的应用

更具柯里化的特性,我们可以写出更有意思的代码,比如在前端开发中经常会遇到这样的情况,当请求从服务器端返回后,需要更新某个特定元素,也就是局部刷新的概念。我们可以这样处理

//update会返回一个函数,这个函数可以设置id属性为item的web元素的内容
function update(item){
    retrun 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);
}

由于update(“newsPanel”)的返回值为一个函数,需要的参数为一个字符串,因此在refresh的Ajax调用中,当success时,会给callback传入服务器端返回的数据信息,从而实现newsPanel面板的刷新,其他的文章面板articlePanel,图片面板picturePanel的刷新均采取这种方式,这样,代码的可读性,可维护性均得到了提高。

你可能感兴趣的:(学习总结)