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 AJAX 用于计算点击率(统计)
Jun 30 Javascript
IE8下String的Trim()方法失效的解决方法
Nov 08 Javascript
一个简单的全屏图片上下打开显示网页效果示例
Jul 08 Javascript
jQuery下拉美化搜索表单效果代码分享
Aug 25 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
Sep 06 Javascript
第七章之菜单按钮图标组件
Apr 25 Javascript
Bootstrap前端开发案例二
Jun 17 Javascript
80%应聘者都不及格的JS面试题
Mar 21 Javascript
JS排序之选择排序详解
Apr 08 Javascript
vue监听input标签的value值方法
Aug 27 Javascript
JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码
Dec 05 Javascript
使用vue开发移动端管理后台的注意事项
Mar 07 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如何实现Unicode和Utf-8编码相互转换
2015/07/29 PHP
php中引用符号(&)的使用详细介绍
2016/12/06 PHP
23个超流行的jQuery相册插件整理分享
2011/04/25 Javascript
jquery实现按Enter键触发事件示例
2013/09/10 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
js处理表格对table进行修饰
2014/05/26 Javascript
js实现input框文字动态变换显示效果
2015/08/19 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
Javascript中的对象和原型(二)
2016/08/12 Javascript
Ajax的概述与实现过程
2016/11/18 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
2017/01/17 Javascript
jQuery模拟实现天猫购物车动画效果实例代码
2017/05/25 jQuery
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
Vue.js 表单控件操作小结
2018/03/29 Javascript
AngularJS $http post 传递参数数据的方法
2018/10/09 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
Python中使用装饰器来优化尾递归的示例
2016/06/18 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
Pycharm学习教程(2) 代码风格
2017/05/02 Python
Mac 上切换Python多版本
2017/06/17 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
2018/01/15 Python
Python中的上下文管理器和with语句的使用
2018/04/17 Python
Python3.7 读取 mp3 音频文件生成波形图效果
2019/11/05 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
Topshop法国官网:英国快速时尚品牌
2018/04/08 全球购物
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
行政助理的职责
2013/11/14 职场文书
五年级科学教学反思
2014/02/05 职场文书
数学教育专业求职信
2014/07/22 职场文书
小学学校门卫岗位职责
2014/08/03 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
python-for x in range的用法(注意要点、细节)
2021/05/10 Python
Python机器学习三大件之一numpy
2021/05/10 Python
JAVA springCloud项目搭建流程
2022/05/11 Java/Android