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 相关文章推荐
简单的无缝滚动程序-仅几行代码
May 08 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
Dec 28 Javascript
浅析IE10兼容性问题(frameset的cols属性)
Jan 03 Javascript
JavaScript DOM事件(笔记)
Apr 08 Javascript
JS+CSS实现简单滑动门(滑动菜单)效果
Sep 19 Javascript
JS 在数组指定位置插入/删除数据的方法
Jan 12 Javascript
JS实现的二叉树算法完整实例
Apr 06 Javascript
React中嵌套组件与被嵌套组件的通信过程
Jul 11 Javascript
小程序点赞收藏功能的实现代码示例
Sep 07 Javascript
详解js动态获取浏览器或页面等容器的宽高
Mar 13 Javascript
原生JS实现随机点名项目的实例代码
Apr 30 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
Feb 03 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实现快速排序的三种方法分享
2014/03/12 PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
2016/01/25 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
2019/04/02 PHP
Laravel实现通过blade模板引擎渲染视图
2019/10/25 PHP
niceTitle 基于jquery的超链接提示插件
2010/05/31 Javascript
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
jQuery增加自定义函数的方法
2015/07/18 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
JS函数的定义与调用方法推荐
2016/05/12 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
node.js-v6新版安装具体步骤(分享)
2017/09/06 Javascript
vue iview实现动态路由和权限验证功能
2018/04/17 Javascript
解决vue跨域axios异步通信问题
2019/04/17 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
2020/05/19 jQuery
微信公众号网页分享功能开发的示例代码
2020/05/27 Javascript
微信小程序获取当前时间及星期几的实例代码
2020/09/20 Javascript
Python中处理时间的几种方法小结
2015/04/09 Python
Python对象转JSON字符串的方法
2016/04/27 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
Python3标准库总结
2019/02/19 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
python读取excel数据并且画图的实现示例
2021/02/08 Python
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
汇智创新科技发展有限公司
2015/12/06 面试题
酒店保安员岗位职责
2014/01/31 职场文书
招商专员岗位职责
2014/02/08 职场文书
班主任经验交流会主持词
2014/04/01 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书
小学数学教师研修感悟
2015/11/18 职场文书
Python实现视频自动打码的示例代码
2022/04/08 Python