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 相关文章推荐
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
Dec 03 Javascript
JavaScript实用技巧(一)
Aug 16 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
Jan 09 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
Aug 30 Javascript
JS自定义对象实现Java中Map对象功能的方法
Jan 20 Javascript
javascript三种代码注释方法
Jun 02 Javascript
Vue.js实现无限加载与分页功能开发
Nov 03 Javascript
使用Bootstrap美化按钮实例代码(demo)
Feb 03 Javascript
jQuery实现最简单实用的分秒倒计时
Feb 05 Javascript
详谈jQuery中的一些正则匹配表达式
Mar 08 Javascript
Vue中使用Sortable的示例代码
Apr 07 Javascript
vue组件之间通信实例总结(点赞功能)
Dec 05 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
DedeCms模板安装/制作概述
2007/03/11 PHP
PHP中PDO的错误处理
2011/09/04 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
2013/06/29 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
PHP中Header使用的HTTP协议及常用方法小结
2014/11/04 PHP
php递归json类实例
2014/12/02 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
php微信开发之百度天气预报
2016/11/18 PHP
Discuz不使用插件实现简单的打赏功能
2019/03/21 PHP
jQuery 页面 Mask实现代码
2010/01/09 Javascript
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
理解Javascript闭包
2013/11/01 Javascript
jquery.validate的使用说明介绍
2013/11/12 Javascript
javascript中bind函数的作用实例介绍
2014/09/28 Javascript
使用js Math.random()函数生成n到m间的随机数字
2014/10/09 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
JavaScript实现页面5秒后自动跳转的方法
2015/04/16 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
2015/08/10 Javascript
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
bootstrap3 兼容IE8浏览器!
2016/05/02 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
node中koa中间件机制详解
2017/08/22 Javascript
vue实现引入本地json的方法分析
2018/07/12 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
JS数据类型判断的几种常用方法
2020/07/07 Javascript
[02:56]DOTA2上海特锦赛小组赛解说FreeAgain采访花絮
2016/02/27 DOTA
深入浅析Python传值与传址
2018/07/10 Python
分享8个非常流行的 Python 可视化工具包
2019/06/05 Python
德国自行车商店:Tretwerk
2019/06/21 全球购物
维也纳通行证:Vienna PASS
2019/07/18 全球购物
办公室岗位职责
2014/02/12 职场文书
聘用意向书
2014/07/29 职场文书
介绍信怎么写
2015/01/30 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
小学生读书笔记范文
2015/06/30 职场文书