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 相关文章推荐
jQuery使用手册之二 DOM操作
Mar 24 Javascript
jQuery中 noConflict() 方法使用
Apr 25 Javascript
js数字转换为float,取N位小数
Feb 08 Javascript
Javascript中判断对象是否为空
Jun 10 Javascript
JS中处理时间之setUTCMinutes()方法的使用
Jun 12 Javascript
JS控制伪元素的方法汇总
Apr 06 Javascript
深入理解js函数的作用域与this指向
May 28 Javascript
json定义及jquery操作json的方法
Sep 29 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
Oct 08 Javascript
js+html5实现页面可刷新的倒计时效果
Jul 15 Javascript
AngularJs 禁止模板缓存的方法
Nov 28 Javascript
RxJS的入门指引和初步应用
Jun 15 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学习之字符串比较和查找
2011/04/17 PHP
PHP中“简单工厂模式”实例代码讲解
2012/09/04 PHP
php生成二维码
2015/08/10 PHP
PHP中JSON的应用技巧
2015/10/10 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
Ubuntu上安装yaf扩展的方法
2018/01/29 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
Jquery插件写法笔记整理
2012/09/06 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
Jquery带搜索框的下拉菜单
2013/05/06 Javascript
jQuery.each使用详解
2015/07/07 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
jQuery Mobile中的button按钮组件基础使用教程
2016/05/23 Javascript
jQuery实现自动调用和触发某个事件的方法
2016/11/18 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
Vue.set 全局操作简单示例
2019/09/19 Javascript
vue实现购物车的监听
2020/04/20 Javascript
django实现前后台交互实例
2017/08/07 Python
转换科学计数法的数值字符串为decimal类型的方法
2018/07/16 Python
Django中信号signals的简单使用方法
2019/07/04 Python
这可能是最好玩的python GUI入门实例(推荐)
2019/07/19 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
python 用户交互输入input的4种用法详解
2019/09/24 Python
python 上下文管理器及自定义原理解析
2019/11/19 Python
Python将list元素转存为CSV文件的实现
2020/11/16 Python
微软瑞士官方网站:Microsoft瑞士
2018/04/20 全球购物
机械工程系毕业生求职信
2013/09/27 职场文书
大四毕业生学习总结的自我评价
2013/10/31 职场文书
2014年计算机专业个人自我评价
2014/01/19 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
毕业生班级鉴定评语
2015/01/04 职场文书
利用Python网络爬虫爬取各大音乐评论的代码
2021/04/13 Python
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技
使用python生成大量数据写入es数据库并查询操作(2)
2022/09/23 Python