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 缩图函数 (onDOMLoaded)……
Oct 23 Javascript
Tips 带三角可关闭的文字提示
Oct 06 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
Jun 29 Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
Apr 23 Javascript
JavaScript判断变量是否为数组的方法(Array)
Feb 24 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
Jun 08 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
Aug 29 Javascript
node网页分段渲染详解
Sep 05 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
Aug 23 Javascript
js使用xml数据载体实现城市省份二级联动效果
Nov 08 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
Oct 22 Javascript
vue实现页面滚动到底部刷新
Aug 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中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
php中apc缓存使用示例
2013/12/25 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
Thinkphp5 自定义上传文件名的实现方法
2019/07/23 PHP
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
JQUERY 对象与DOM对象之两者相互间的转换
2009/04/27 Javascript
js 鼠标拖动对象 可让任何div实现拖动效果
2009/11/09 Javascript
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
js location.replace与location.reload的区别
2010/09/08 Javascript
JavaScript高级程序设计 学习笔记 js高级技巧
2011/09/20 Javascript
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
2013/12/11 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
nodeJS进程管理器pm2的使用
2019/01/09 NodeJs
JS实现超级好看的鼠标小尾巴特效
2020/12/01 Javascript
[40:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs TNC
2018/04/01 DOTA
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
2017/07/06 Python
Python实现八皇后问题示例代码
2018/12/09 Python
python实现三维拟合的方法
2018/12/29 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
Django REST framework 视图和路由详解
2019/07/19 Python
django admin.py 外键,反向查询的实例
2019/07/26 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例
2020/03/06 Python
python和php学习哪个更有发展
2020/06/17 Python
Pytorch之扩充tensor的操作
2021/03/04 Python
如何定义一个可复用的服务
2014/09/30 面试题
教师自荐信
2013/12/10 职场文书
英语专业学生个人求职信
2014/01/28 职场文书
怎么写自荐书范文
2014/02/12 职场文书
小学清明节活动总结
2014/07/04 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
基层党支部承诺书
2015/04/30 职场文书
员工工作心得体会
2019/05/07 职场文书
html实现弹窗的实例
2021/06/09 HTML / CSS