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 学习笔记(onchange等)
Nov 14 Javascript
jQuery表单验证插件formValidator(改进版)
Feb 03 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
Oct 11 Javascript
js jquery验证银行卡号信息正则学习
Jan 21 Javascript
jquery固定底网站底部菜单效果
Aug 13 Javascript
javascript实现仿IE顶部的可关闭警告条
May 05 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
Dec 02 Javascript
jquery实现提示语淡入效果
May 05 jQuery
JS之if语句对接事件动作逻辑(详解)
Jun 28 Javascript
React中使用async validator进行表单验证的实例代码
Aug 17 Javascript
js实现通过开始结束控制的计时器
Feb 25 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
Aug 03 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
sony ICF-2010 拆解与改装
2021/03/02 无线电
PHP 飞信好友免费短信API接口开源版
2010/07/22 PHP
PHP调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
tp5框架使用composer实现日志记录功能示例
2019/01/10 PHP
jquery图片上下tab切换效果
2011/03/18 Javascript
JS中Date日期函数中的参数使用介绍
2014/01/02 Javascript
jQuery中的jQuery()方法用法分析
2014/12/27 Javascript
JavaScript模拟实现键盘打字效果
2015/06/29 Javascript
基于javascript编写简单日历
2016/05/02 Javascript
Bootstrap基本插件学习笔记之按钮(21)
2016/12/08 Javascript
Node.js 中exports 和 module.exports 的区别
2017/03/14 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
2017/09/23 Javascript
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
vue 自定义 select内置组件
2018/04/10 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
2019/08/28 Javascript
vue实现文件上传读取及下载功能
2020/11/17 Javascript
如何通过Proxy实现JSBridge模块化封装
2020/10/22 Javascript
[02:56]DOTA2上海特锦赛小组赛解说FreeAgain采访花絮
2016/02/27 DOTA
Python3中条件控制、循环与函数的简易教程
2017/11/21 Python
pyinstaller打包程序exe踩过的坑
2019/11/19 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
tensorflow常用函数API介绍
2020/04/19 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
Django 实现 Websocket 广播、点对点发送消息的代码
2020/06/03 Python
谈谈python垃圾回收机制
2020/09/27 Python
CSS3实现苹果手机解锁的字体闪亮效果示例
2021/01/05 HTML / CSS
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
来自Ocado的宠物商店:Fetch
2018/07/10 全球购物
初中生三年学习生活的自我评价
2013/11/03 职场文书
计算机相关的自我评价
2014/01/15 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
2015七夕情人节宣传语
2015/07/14 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
Go Plugins插件的实现方式
2021/08/07 Golang
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android