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日期处理类库分享
Apr 15 Javascript
表单验证的完整应用案例探讨
Mar 29 Javascript
iframe子父页面调用js函数示例
Nov 07 Javascript
js快速排序的实现代码
Dec 08 Javascript
一个仿糯米弹框效果demo
Jul 22 Javascript
XML文件转化成NSData对象的方法
Aug 12 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
Nov 30 Javascript
JavaScript设计模式之策略模式详解
Jun 09 Javascript
荐书|您有一份JavaScript书单待签收
Jul 21 Javascript
vue多种弹框的弹出形式的示例代码
Sep 18 Javascript
微信小程序BindTap快速连续点击目标页面跳转多次问题处理
Apr 08 Javascript
详解vue 自定义marquee无缝滚动组件
Apr 09 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 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
Codeigniter的一些优秀特性总结
2015/01/21 PHP
PHP如何解决微信文章图片防盗链
2020/12/09 PHP
最佳的addEvent事件绑定是怎样诞生的
2011/10/24 Javascript
使用javascript实现页面定时跳转总结篇
2013/09/21 Javascript
JS 有趣的eval优化输入验证实例代码
2013/09/22 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
JQuery实现动态操作表格
2017/01/11 Javascript
一文让你彻底搞清楚javascript中的require、import与export
2017/09/24 Javascript
js 取消页面可以选中文字的功能方法
2018/01/02 Javascript
JS实现Cookie读、写、删除操作工具类示例
2018/08/28 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
Node.js之删除文件夹(含递归删除)代码实例
2019/09/09 Javascript
js+for循环实现字符串自动转义的代码(把后面的字符替换前面的字符)
2020/12/24 Javascript
python自动生成model文件过程详解
2019/11/02 Python
python如何导入依赖包
2020/07/13 Python
美国网上花店:JustFlowers
2017/02/12 全球购物
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
青年文明号复核材料
2014/02/11 职场文书
《乌塔》教学反思
2014/02/17 职场文书
电话客服专员岗位职责
2014/06/28 职场文书
《中国梦我的梦》大学生演讲稿
2014/08/20 职场文书
幼儿园六一儿童节活动方案
2014/08/26 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
借款民事起诉状范文
2015/05/19 职场文书
党员反四风学习心得体会
2016/01/22 职场文书
《小蝌蚪找妈妈》教学反思
2016/02/23 职场文书
python识别围棋定位棋盘位置
2021/07/26 Python
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript
Java实现二分搜索树的示例代码
2022/03/17 Java/Android
分享一个vue实现的记事本功能案例
2022/04/11 Vue.js