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 相关文章推荐
滚动经典最新话题[prototype框架]下编写
Oct 03 Javascript
JavaScript 学习历程和心得分享
Dec 12 Javascript
JS图片切换的具体方法(带缩略图版)
Nov 12 Javascript
深入浅析AngularJS和DataModel
Feb 16 Javascript
基于Bootstrap使用jQuery实现简单可编辑表格
May 04 Javascript
深入理解$.each和$(selector).each
May 15 Javascript
JavaScript每天必学之基础知识
Sep 17 Javascript
JavaScript提高加载和执行效率的方法
Feb 03 Javascript
深入理解javascript的getTime()方法
Feb 16 Javascript
Vue.js 2.0和Cordova开发webApp环境搭建方法
Feb 26 Javascript
TypeScript中的方法重载详解
Apr 12 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
May 30 jQuery
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程序实现支持页面后退的两种方法
2008/06/30 PHP
探讨Hessian在PHP中的使用分析
2013/06/13 PHP
ThinkPHP缓存方法S()概述
2014/06/13 PHP
实现PHP框架系列文章(6)mysql数据库方法
2016/03/04 PHP
PHP信号处理机制的操作代码讲解
2019/04/19 PHP
jquery 结合C#后台的数组对文章的关键字自动添加链接的代码
2011/07/15 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
angularjs实现与服务器交互分享
2014/06/24 Javascript
使用jquery.qrcode生成彩色二维码实例
2014/08/08 Javascript
angularjs中的单元测试实例
2014/12/06 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
详解堆的javascript实现方法
2016/11/29 Javascript
在 Angular 中实现搜索关键字高亮示例
2017/03/21 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
详解javascript中的变量提升和函数提升
2018/05/24 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
BootStrap table实现表格行拖拽效果
2018/12/01 Javascript
基于iview的router常用控制方式
2019/05/30 Javascript
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python 详解基本语法_函数_返回值
2017/01/22 Python
Python正则表达式完全指南
2017/05/25 Python
python中MethodType方法介绍与使用示例
2017/08/03 Python
Python设计实现的计算器功能完整实例
2017/08/18 Python
使用python Telnet远程登录执行程序的方法
2019/01/26 Python
浅谈Python爬虫基本套路
2019/03/25 Python
浅析Python 多行匹配模式
2020/07/24 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
修复iPhone的safari浏览器上submit按钮圆角bug
2012/12/24 HTML / CSS
css3实现文字首尾衔接跑马灯的示例代码
2020/10/16 HTML / CSS
房屋买卖协议书范本
2014/04/10 职场文书
乡镇镇长个人整改措施
2014/10/01 职场文书
技术负责人岗位职责
2015/02/10 职场文书
爱护公物主题班会
2015/08/17 职场文书
浅谈python数据类型及其操作
2021/05/25 Python