Javascript闭包与函数柯里化浅析


Posted in Javascript onJune 22, 2016

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

一、柯里化的概念

在计算机科学中,柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由Christopher Strachey以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。在直觉上,柯里化声称“如果你固定某些参数,你将得到接受余下参数的一个函数”。所以对于有两个变量的函数yx,如果固定了y = 2,则得到有一个变量的函数2x。

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

var adder = function(num){
  return function(y){
     return num + y;
  }
}
var inc = adder(1);
var dec = adder(-1)

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

//inc, dec现在是两个新的函数,作用是将传入的参数值(+/-)1
print(inc(99));//100
print(dec(101));//100
print(adder(100)(2));//102
print(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);
}

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

以上就是本文的全部内容,了解更多JavaScript的语法,大家可以查看:《JavaScript 参考教程》、《JavaScript代码风格指南》,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用js遍历 table的脚本
Jul 23 Javascript
JQuery扩展插件Validate 2通过参数设置验证规则
Sep 05 Javascript
ajax不执行success回调而是执行了error回调
Dec 10 Javascript
js跳转页面方法总结
Jan 29 Javascript
Javascript写入txt和读取txt文件示例
Feb 12 Javascript
jquery操作复选框checkbox的方法汇总
Feb 05 Javascript
js实现图片从左往右渐变切换效果的方法
Feb 06 Javascript
针对初学者的jQuery入门指南
Aug 15 Javascript
详谈jQuery中的一些正则匹配表达式
Mar 08 Javascript
解决vue.js this.$router.push无效的问题
Sep 03 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
Apr 22 Javascript
深入解析微信小程序开发中遇到的几个小问题
Jul 11 Javascript
JS中innerHTML和pasteHTML的区别实例分析
Jun 22 #Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
Jun 22 #Javascript
浅析JavaScript中命名空间namespace模式
Jun 22 #Javascript
Javascript实现图片不间断滚动的代码
Jun 22 #Javascript
Javascript将双字节字符转换成单字节字符并计算长度
Jun 22 #Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
Jun 22 #Javascript
Javascript 5种方法实现过滤删除前后所有空格
Jun 22 #Javascript
You might like
php在线代理转向代码
2012/05/05 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
如何通过Linux命令行使用和运行PHP脚本
2015/07/29 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
php求数组全排列,元素所有组合的方法总结
2017/03/14 PHP
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
Javascript 颜色渐变效果的实现代码
2013/10/01 Javascript
node.js中的fs.mkdirSync方法使用说明
2014/12/17 Javascript
jQuery实现可用于博客的动态滑动菜单
2015/03/09 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
vue组件的写法汇总
2018/04/12 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
Vue列表渲染的示例代码
2018/11/01 Javascript
图文讲解vue的v-if使用方法
2019/02/11 Javascript
Vue 幸运大转盘实现思路详解
2019/05/06 Javascript
微信小程序点餐系统开发常见问题汇总
2019/08/06 Javascript
vue使用axios实现excel文件下载的功能
2020/07/16 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
JavaScript中Object、map、weakmap的区别分析
2020/12/15 Javascript
盘点提高 Python 代码效率的方法
2014/07/03 Python
Python列表切片用法示例
2017/04/19 Python
详解Python if-elif-else知识点
2018/06/11 Python
python采集微信公众号文章
2018/12/20 Python
python实现mean-shift聚类算法
2020/06/10 Python
Java基础知识面试要点
2016/07/29 面试题
创建索引时需要注意的事项
2013/05/13 面试题
优秀经理事迹材料
2014/02/01 职场文书
国际政治学专业推荐信
2014/09/26 职场文书
单位租房协议书范本
2014/12/04 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
会计实训总结范文
2015/08/03 职场文书
遗嘱范文
2015/08/07 职场文书
导游词之淮安明祖陵
2019/11/25 职场文书
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
详解Java实践之抽象工厂模式
2021/06/18 Java/Android
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers