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入门·对象属性方法大总结
Oct 01 Javascript
jquery 滚动条事件简单实例
Jul 12 Javascript
js中parseInt函数浅谈
Jul 31 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
Feb 12 Javascript
js常用系统函数用法实例分析
Jan 12 Javascript
详解JavaScript数组和字符串中去除重复值的方法
Mar 07 Javascript
js实现导航吸顶效果
Feb 24 Javascript
JQuery扩展对象方法操作示例
Aug 21 jQuery
Vue监听事件实现计数点击依次增加的方法
Sep 26 Javascript
angularJs中$scope数据序列化的实例
Sep 30 Javascript
详解vue几种主动刷新的方法总结
Feb 19 Javascript
node解析修改nginx配置文件操作实例分析
Nov 06 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中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
解析thinkphp import 文件内容变量失效的问题
2013/06/20 PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
2014/05/06 PHP
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
JQuery从头学起第二讲
2010/07/04 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
js通过元素class名字获取元素集合的具体实现
2014/01/06 Javascript
js实现文本框选中的方法
2015/05/26 Javascript
JQuery用户名校验的具体实现
2016/03/18 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
jQuery实现复选框的全选和反选
2017/02/02 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
2017/07/27 Javascript
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
解决Angular4项目部署到服务器上刷新404的问题
2018/08/31 Javascript
深入浅出vue图片路径的实现
2019/09/04 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
小程序实现点击tab切换左右滑动
2020/11/16 Javascript
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
python中os操作文件及文件路径实例汇总
2015/01/15 Python
利用Python的Django框架中的ORM建立查询API
2015/04/20 Python
Python实现求最大公约数及判断素数的方法
2015/05/26 Python
python3.0 模拟用户登录,三次错误锁定的实例
2017/11/02 Python
如何通过Python实现标签云算法
2019/07/02 Python
提升Python效率之使用循环机制代替递归函数
2019/07/23 Python
python安装scipy的步骤解析
2019/09/28 Python
Python抓包程序mitmproxy安装和使用过程图解
2020/03/02 Python
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
《欢乐的泼水节》教学反思
2014/04/22 职场文书
人事经理岗位职责
2014/04/28 职场文书
祖国在我心中演讲稿600字
2014/05/04 职场文书
优秀员工推荐信
2014/05/10 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
python 经纬度求两点距离、三点面积操作
2021/06/03 Python