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 Ajax 学习实例2 向页面发出请求 返回JSon格式数据
Mar 15 Javascript
JavaScript与DOM组合动态创建表格实例
Dec 23 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
Jun 08 Javascript
JS实现跟随鼠标立体翻转图片的方法
May 04 Javascript
基于JavaScript实现树形下拉框
Aug 10 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
Oct 27 jQuery
js实现数组内数据的上移和下移的实例
Nov 14 Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
Mar 13 Javascript
PostgreSQL Node.js实现函数计算方法示例
Feb 12 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
Oct 12 Javascript
Vue实现附件上传功能
May 28 Javascript
详解JavaScript 事件流
Sep 02 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 字符串 小常识
2009/06/05 PHP
获取远程文件大小的php函数
2010/01/11 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
2014/08/25 PHP
CSS心形加载的动画源码的实现
2021/03/09 HTML / CSS
在JavaScript中实现命名空间
2006/11/23 Javascript
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
JavaScript SetInterval与setTimeout使用方法详解
2013/11/15 Javascript
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
jquery 插件实现瀑布流图片展示实例
2015/04/03 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
轮播图组件js代码
2016/08/08 Javascript
相册展示PhotoSwipe.js插件实现
2016/08/25 Javascript
angular.js中解决跨域问题的三种方式
2017/07/12 Javascript
angular 组件通信的几种实现方式
2018/07/13 Javascript
vue全局使用axios的操作
2020/09/08 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
Python如何读取、写入JSON数据
2020/07/28 Python
德国百年厨具品牌WMF美国站:WMF美国
2016/09/12 全球购物
DJI大疆无人机官方商城:全球领先的无人飞行器研发和生产商
2016/12/21 全球购物
市三好学生主要事迹
2014/01/28 职场文书
幼儿园亲子活动方案
2014/01/29 职场文书
大学新生军训感言
2014/02/25 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书
运动会广播稿200字
2014/10/18 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
个人年终总结结尾
2015/03/06 职场文书
入伍通知书
2015/04/23 职场文书
看完这篇文章获得一些java if优化技巧
2021/07/15 Java/Android
Go语言应该什么情况使用指针
2021/07/25 Golang
Golang 对es的操作实例
2022/04/20 Golang