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 相关文章推荐
SharePoint 客户端对象模型 (一) ECMA Script
May 22 Javascript
基于jquery tab切换(防止页面刷新)
May 23 Javascript
js性能优化技巧
Nov 29 Javascript
js倒计时简单实现代码
Aug 11 Javascript
JS填写银行卡号每隔4位数字加一个空格
Dec 19 Javascript
Javascript实现信息滚动效果
May 18 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
Jul 19 Javascript
微信小程序授权获取用户详细信息openid的实例详解
Sep 20 Javascript
javaScript实现复选框全选反选事件详解
Nov 20 Javascript
js中apply和Math.max()函数的问题及区别介绍
Mar 27 Javascript
详解关于微信setData回调函数中的坑
Feb 18 Javascript
ajax请求前端跨域问题原因及解决方案
Oct 16 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实现登陆表单提交CSRF及验证码
2017/01/24 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
Smarty缓存机制实例详解【三种缓存方式】
2019/07/20 PHP
jquery之Document元素选择器篇
2008/08/14 Javascript
javaScript 数值型和字符串型之间的转换
2009/07/25 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
2014/05/11 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
jQuery实现仿新浪微博浮动的消息提示框(可智能定位)
2015/10/10 Javascript
理解javascript异步编程
2016/01/27 Javascript
分享我对JS插件开发的一些感想和心得
2016/02/04 Javascript
JavaScript面向对象程序设计教程
2016/03/29 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
jQuery内容折叠效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
JavaScript 最佳实践:帮你提升代码质量
2016/12/03 Javascript
微信小程序之判断页面滚动方向的示例代码
2018/08/30 Javascript
详解如何创建并发布一个 vue 组件
2018/11/08 Javascript
JavaScript页面倒计时功能完整示例
2019/05/15 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
微信小程序实现电子签名并导出图片
2020/05/27 Javascript
Python使用cx_Freeze库生成msi格式安装文件的方法
2018/07/10 Python
python 实现A*算法的示例代码
2018/08/13 Python
如何给Python代码进行加密
2020/01/10 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
手工制作的意大利皮革运动鞋:KOIO
2020/01/05 全球购物
介绍一下.net和Java的特点和区别
2012/09/26 面试题
sort命令的作用和用法
2012/11/04 面试题
你们项目是如何进行变更控制的
2015/08/26 面试题
抽样调查项目计划书
2014/04/24 职场文书
孝敬父母的活动方案
2014/08/28 职场文书
2015年专项整治工作总结
2015/04/03 职场文书
单位工作证明范本
2015/06/15 职场文书
Vue项目打包、合并及压缩优化网页响应速度
2021/07/07 Vue.js
人物搭配车车超萌联名预备中 【咒术迴战】 ⨯ 【天竺鼠车车】 展开合作
2022/04/11 日漫