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 相关文章推荐
基于jQuery的计算文本框字数的代码
Jun 06 Javascript
在jQuery ajax中按钮button和submit的区别分析
Oct 07 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
Jan 06 Javascript
浅析jquery的js图表组件highcharts
Mar 06 Javascript
简介alert()与console.log()的不同
Aug 26 Javascript
微信小程序 slider 详解及实例代码
Jan 10 Javascript
Angular.js自定义指令学习笔记实例
Feb 24 Javascript
Vue2.0设置全局样式(less/sass和css)
Nov 18 Javascript
解决vue-cli创建项目的loader问题
Mar 13 Javascript
解决Angular4项目部署到服务器上刷新404的问题
Aug 31 Javascript
微信小程序获取用户openid的实现
Dec 24 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
Apr 01 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需登录的文件上传管理系统
2020/03/21 PHP
Joomla调用系统自带编辑器的实现方法
2016/05/05 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
js form action动态修改方法
2008/11/04 Javascript
判断控件是否已加载完成的代码
2010/02/24 Javascript
require.js深入了解 require.js特性介绍
2014/09/04 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
node.js实现爬虫教程
2020/08/25 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
JS实现前端缓存的方法
2017/09/21 Javascript
jQuery中的类名选择器(.class)用法简单示例
2018/05/14 jQuery
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
jquery判断滚动条距离顶部的距离方法
2018/09/05 jQuery
详解node字体压缩插件font-spider的用法
2018/09/28 Javascript
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
Python中实现常量(Const)功能
2015/01/28 Python
Python lxml模块安装教程
2015/06/02 Python
Python tkinter事件高级用法实例
2018/01/31 Python
python将txt文档每行内容循环插入数据库的方法
2018/12/28 Python
Python2与Python3的区别详解
2020/02/09 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
2020/04/24 Python
Django如何使用redis作为缓存
2020/05/21 Python
Django --Xadmin 判断登录者身份实例
2020/07/03 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
JDO的含义
2012/11/17 面试题
C#里面如何倒序排列一个数组的元素?
2013/06/21 面试题
优秀求职自荐信怎样写
2013/12/18 职场文书
2014年行政执法工作总结
2014/12/11 职场文书
2019自荐信范文集锦!
2019/07/03 职场文书
Pytorch GPU内存占用很高,但是利用率很低如何解决
2021/06/01 Python
Python 如何利用ffmpeg 处理视频素材
2021/11/27 Python