JavaScript函数柯里化详解


Posted in Javascript onApril 29, 2016

什么是柯里化

柯里化是这样的一个转换过程,把接受多个参数的函数变换成接受一个单一参数(译注:最初函数的第一个参数)的函数,如果其他的参数是必要的,返回接受余下的参数且返回结果的新函数。

柯理化函数思想:一个js预先处理的思想;利用函数执行可以形成一个不销毁的作用域的原理,把需要预先处理的内容都储存在这个不销毁的作用域中,并且返回一个小函数,以后我们执行的都是小函数,在小函数中把之前预先存储的值进行相关的操作处理即可;

柯里化函数主要起到预处理的作用;

bind方法的作用:把传递进来的callback回调方法中的this预先处理为上下文context;

bind方法实现原理1代码如下所示:

/**
* bind方法实现原理1
* @param callback [Function] 回调函数
* @param context [Object] 上下文
* @returns {Function} 改变this指向的函数
*/
function bind(callback,context) {
var outerArg = Array.prototype.slice.call(arguments,2);// 表示取当前作用域中传的参数中除了fn,context以外后面的参数;
return function (){
var innerArg = Array.prototype.slice.call(arguments,0);//表示取当前作用域中所有的arguments参数;
callback.apply(context,outerArg.concat(innerArg));
}
}

下面一段代码模仿在原型链上的bind实现原理

/**
* 模仿在原型链上的bind实现原理(柯理化函数思想)
* @param context [Object] 上下文
* @returns {Function} 改变this指向的函数
*/
Function.prototype.mybind = function mybind (context) {
var _this = this;
var outArg = Array.prototype.slice.call(arguments,1);
// 兼容情况下
if('bind' in Function.prototype) {
return this.bind.apply(this,[context].concat(outArg));
}
// 不兼容情况下
return function () {
var inArg = Array.prototype.slice.call(arguments,0);
inArg.length === 0?inArg[inArg.length]=window.event:null;
var arg = outArg.concat(inArg);
_this.apply(context,arg);
}
}

函数柯里化(Currying)

在计算机科学中,柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术

柯里化就是预先将某些参数传入,得到一个简单的函数。但是预先传入的参数被保存在闭包中,因此会有一些奇特的特性。比如:

例:

var adder = function(num) {
return function(y) {
return num + y;
}
}
var inc = adder(1);
var dec = adder(-1);
//inc, dec现在是两个新的函数,作用是将传入的参数值(+/-)1
alert(inc(99));//100
alert(dec(101));//100
alert(adder(100)(2));//102
alert(adder(2)(100));//102

以上内容是小编给大家介绍的JavaScript函数柯里化及实现bind方法的方法,希望对大家有所帮助!

Javascript 相关文章推荐
jQuery toggleClass应用实例(附效果图)
Apr 06 Javascript
jQuery实现表单提交时判断的方法
Dec 13 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
Sep 20 Javascript
jQuery使用$.ajax进行即时验证实例详解
Dec 11 Javascript
javascript先序遍历DOM树的方法
Feb 27 Javascript
jquery制做精致的倒计时特效
Jun 13 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
Jun 21 Javascript
JavaScript中windows.open()、windows.close()方法详解
Jul 28 Javascript
基于JS设计12306登录页面
Dec 28 Javascript
vue使用axios时关于this的指向问题详解
Dec 22 Javascript
JS回调函数深入理解
Oct 16 Javascript
Vue项目配置跨域访问和代理proxy设置方式
Sep 08 Javascript
easyui validatebox验证
Apr 29 #Javascript
浅析Bootstrap缩略图组件与警示框组件
Apr 29 #Javascript
javascript中利用柯里化函数实现bind方法
Apr 29 #Javascript
Bootstrap模态对话框的简单使用
Apr 29 #Javascript
jquery UI Datepicker时间控件的使用及问题解决
Apr 28 #Javascript
jquery弹出遮掩层效果【附实例代码】
Apr 28 #Javascript
onclick和onblur冲突问题的快速解决方法
Apr 28 #Javascript
You might like
PHP 开源框架22个简单简介
2009/08/24 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
2017/05/12 PHP
js String对象中常用方法小结(字符串操作)
2012/01/27 Javascript
js去除重复字符串两种实现方法
2013/01/09 Javascript
基于jQuery选择器的整理集合
2013/04/26 Javascript
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
jQuery控制元素显示、隐藏、切换、滑动的方法总结
2015/04/16 Javascript
javascript实现全局匹配并替换的方法
2015/04/27 Javascript
window.onload使用指南
2015/09/13 Javascript
js实现微博发布小功能
2017/01/12 Javascript
原生JS仿QQ阅读点击展开、收起效果
2017/03/08 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
react中使用swiper的具体方法
2018/05/15 Javascript
angularjs $http调用接口的方式详解
2018/08/13 Javascript
jquery向后台提交数组的代码分析
2020/02/20 jQuery
elementUI同一页面展示多个Dialog的实现
2020/11/19 Javascript
python去除文件中空格、Tab及回车的方法
2016/04/12 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
Python 列表理解及使用方法
2017/10/27 Python
更换Django默认的模板引擎为jinja2的实现方法
2018/05/28 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
Python实现FTP文件传输的实例
2019/07/07 Python
Django-Model数据库操作(增删改查、连表结构)详解
2019/07/17 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
苹果中国官方网站:Apple中国
2016/07/22 全球购物
英国在线电子和小工具商店:TecoBuy
2018/10/06 全球购物
科颜氏英国官网:Kiehl’s英国
2019/11/20 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
2013/03/30 面试题
工商企业管理实习自我鉴定
2013/12/04 职场文书
媒矿安全生产承诺书
2014/05/23 职场文书
教师民族团结演讲稿
2014/08/27 职场文书
大学生交通专业求职信
2014/09/01 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
刑事上诉状(量刑过重)
2015/05/23 职场文书
关于Numpy之repeat、tile的用法总结
2021/06/02 Python