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 相关文章推荐
5个可以帮你理解JavaScript核心闭包和作用域的小例子
Oct 08 Javascript
了不起的node.js读书笔记之node的学习总结
Dec 22 Javascript
jQuery结合HTML5制作的爱心树表白动画
Feb 01 Javascript
解决js函数闭包内存泄露问题的办法
Jan 25 Javascript
AngularJS入门教程之AngularJS表达式
Apr 18 Javascript
微信小程序 用户数据解密详细介绍
Jan 09 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
Oct 15 jQuery
javascript用rem来做响应式开发
Jan 13 Javascript
Vue中控制v-for循环次数的实现方法
Sep 26 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
Sep 10 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
Dec 30 Vue.js
Vue常用API、高级API的相关总结
Feb 02 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
php文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
2015/03/18 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
使用Javascript接收get传递的值的代码
2011/11/30 Javascript
jQuery回调函数的定义及用法实例
2014/12/23 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
2016/03/28 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
2017/06/13 Javascript
详解Angular-cli生成组件修改css成less或sass的实例
2017/07/27 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
微信小程序网络层封装的实现(promise, 登录锁)
2019/05/08 Javascript
微信小程序云开发如何使用云函数生成二维码
2019/05/18 Javascript
python模拟enum枚举类型的方法小结
2015/04/30 Python
对python周期性定时器的示例详解
2019/02/19 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
解决python xx.py文件点击完之后一闪而过的问题
2019/06/24 Python
python3使用腾讯企业邮箱发送邮件的实例
2019/06/28 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
Pytorch中的VGG实现修改最后一层FC
2020/01/15 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
python中二分查找法的实现方法
2020/12/06 Python
Python爬虫入门教程02之笔趣阁小说爬取
2021/01/24 Python
伦敦时尚生活的缩影:LN-CC
2017/01/24 全球购物
售后服务承诺书怎么写
2014/05/21 职场文书
团队激励口号
2014/06/06 职场文书
保护环境标语
2014/06/09 职场文书
刑事和解协议书范本
2014/11/19 职场文书
公积金接收函格式
2015/01/30 职场文书
学习保证书怎么写
2015/02/26 职场文书
从严治党主题教育活动总结
2015/05/07 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
php png失真的原因及解决办法
2021/10/24 PHP
Go语言的协程上下文的几个方法和用法
2022/04/11 Golang