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 相关文章推荐
图片自动更新(说明)
Oct 02 Javascript
js日期联动示例
May 02 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
Jan 09 Javascript
Javascript中的作用域和上下文深入理解
Jul 03 Javascript
js实现带农历和八字等信息的日历特效
May 16 Javascript
全面解析标签页的切换方式
Aug 21 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
Jan 13 Javascript
原生js轮播特效
May 18 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
Aug 27 Javascript
vue实现购物车小案例
Sep 27 Javascript
详解小程序云开发攻略(解决最棘手的问题)
Sep 30 Javascript
浅谈vue生命周期共有几个阶段?分别是什么?
Aug 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最常用的ini函数分析 针对PHP.ini配置文件
2010/04/22 PHP
IE与Firefox下javascript getyear年份的兼容性写法
2007/12/20 Javascript
jQuery实现类似滑动门切换效果的层切换
2013/09/23 Javascript
在Node.js中实现文件复制的方法和实例
2014/06/05 Javascript
jQuery 重复加载错误以及修复方法
2014/12/16 Javascript
JavaScript不使用prototype和new实现继承机制
2014/12/29 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
JavaScript面试题(指针、帽子和女朋友)
2016/11/23 Javascript
简单好用的nodejs 爬虫框架分享
2017/03/26 NodeJs
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
ES6学习教程之Map的常用方法总结
2017/08/03 Javascript
node实现定时发送邮件的示例代码
2017/08/26 Javascript
AngularJs ng-change事件/指令的用法小结
2017/11/01 Javascript
vue实现引入本地json的方法分析
2018/07/12 Javascript
vue-cli3.0使用及部分配置详解
2018/08/29 Javascript
详解js静态检查工具eslint配置文件
2018/11/23 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
vue+eslint+vscode配置教程
2019/08/09 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
2019/08/20 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
从零学Python之引用和类属性的初步理解
2014/05/15 Python
Python使用redis pool的一种单例实现方式
2016/04/16 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
Python生成器generator原理及用法解析
2020/07/20 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
2021/03/03 Python
html5的新增的标签和废除的标签简要概述
2013/02/20 HTML / CSS
Antonioli美国在线商店:时尚前卫奢华
2019/07/29 全球购物
What is view? why do we have view?
2012/06/22 面试题
化验室技术员岗位职责
2013/12/24 职场文书
对祖国的寄语大全
2014/04/11 职场文书
golang gopm get -g -v 无法获取第三方库的解决方案
2021/05/05 Golang