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 相关文章推荐
最常用的12种设计模式小结
Aug 09 Javascript
javascript记录文本框内文字个数检测文字个数变化
Oct 14 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
Mar 04 Javascript
jQueryUI DatePicker 添加时分秒
Jun 04 Javascript
基于jquery插件编写countdown计时器
Jun 12 Javascript
vue-router实现组件间的跳转(参数传递)
Nov 07 Javascript
微信小程序实现刷脸登录
May 25 Javascript
详解react native页面间传递数据的几种方式
Nov 07 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
Sep 10 Javascript
浅析JavaScript预编译和暗示全局变量
Sep 03 Javascript
JavaScript实现打字游戏
Feb 19 Javascript
vue特效之翻牌动画
Apr 20 Vue.js
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
当年上海收录机产品生产,进口和价格情况
2021/03/04 无线电
ajax完美实现两个网页 分页功能的实例代码
2013/04/16 PHP
PHP读取大文件末尾N行的高效方法推荐
2016/06/03 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
用JS剩余字数计算的代码
2008/07/03 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
jQuery获取选中内容及设置元素属性的方法
2014/07/09 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
2014/08/15 Javascript
jQuery基于图层模仿五星星评价功能的方法
2015/05/07 Javascript
jquery html动态添加的元素绑定事件详解
2016/05/24 Javascript
js实现图片缓慢放大缩小效果
2016/08/02 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
require.js中的define函数详解
2017/07/10 Javascript
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
jQuery的ztree仿windows文件新建和拖拽功能的实现代码
2018/12/05 jQuery
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
[46:44]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
python 字符串转列表 list 出现\ufeff的解决方法
2017/06/22 Python
基于Django的python验证码(实例讲解)
2017/10/23 Python
python如何将图片转换为字符图片
2020/08/19 Python
帕克纽约:PARKER NY
2018/12/09 全球购物
sort命令的作用和用法
2013/08/25 面试题
日期和时间问题
2015/01/04 面试题
美丽乡村建设实施方案
2014/03/23 职场文书
毕业生求职自荐书范文
2014/03/27 职场文书
幼儿园小班评语
2014/04/18 职场文书
办理收楼委托书范本
2014/10/09 职场文书
社区五一劳动节活动总结
2015/02/09 职场文书
警示教育观后感
2015/06/17 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
Apache Hudi数据布局黑科技降低一半查询时间
2022/03/31 Servers
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python