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 相关文章推荐
javascript URL锚点取值方法
Feb 25 Javascript
测试你的JS的掌握程度的代码
Dec 09 Javascript
基于jquery的一个图片hover的插件
Apr 24 Javascript
Javascript仿PHP $_GET获取URL中的参数
May 12 Javascript
详谈jQuery中的this和$(this)
Nov 13 Javascript
JQuery中$.each 和$(selector).each()的区别详解
Mar 13 Javascript
JS组件Form表单验证神器BootstrapValidator
Jan 26 Javascript
vue不通过路由直接获取url中参数的方法示例
Aug 24 Javascript
支付宝小程序tabbar底部导航
Nov 06 Javascript
Vue触发隐藏input file的方法实例详解
Aug 14 Javascript
JS实现动态无缝轮播
Jan 11 Javascript
JavaScript实现贪吃蛇游戏
Jun 16 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 fsockopen伪造post与get方法的详解
2013/06/14 PHP
php使用反射插入对象示例分享
2014/03/11 PHP
php项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
CodeIgniter记录错误日志的方法全面总结
2016/05/17 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
php微信公众平台开发(一) 配置接口
2016/12/06 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
2020/04/07 PHP
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
JQuery.Ajax之错误调试帮助信息介绍
2013/07/04 Javascript
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
js类定义函数时用prototype与不用的区别示例介绍
2014/06/10 Javascript
nodejs中使用monk访问mongodb
2014/07/06 NodeJs
JS中事件冒泡和事件捕获介绍
2016/12/13 Javascript
vue父子组件的嵌套的示例代码
2017/09/08 Javascript
基于javascript的拖拽类封装详解
2019/04/19 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
Vue根据条件添加click事件的方式
2019/11/09 Javascript
分享JS表单验证源码(带错误提示及密码等级)
2020/01/05 Javascript
Python实现过滤单个Android程序日志脚本分享
2015/01/16 Python
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
解决Python中字符串和数字拼接报错的方法
2016/10/23 Python
python线程池threadpool实现篇
2018/04/27 Python
python中退出多层循环的方法
2018/11/27 Python
对python借助百度云API对评论进行观点抽取的方法详解
2019/02/21 Python
使用OpenCV实现仿射变换—旋转功能
2019/08/29 Python
详解Python中import机制
2020/09/11 Python
全球最大的在线旅游公司:Expedia
2017/11/16 全球购物
JSF如何进行表格处理及取值
2012/08/06 面试题
遇到的Mysql的面试题
2014/06/29 面试题
大学生个人推荐信范文
2013/11/25 职场文书
四好少年事迹材料
2014/01/12 职场文书
2015年保险业务员工作总结
2015/05/27 职场文书
仰望星空观后感
2015/06/10 职场文书
纪检监察立案决定书
2015/06/24 职场文书
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python