从bind函数看js中的柯里化
以下是百度百科对柯里化函数的解释:柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。概念太抽象,可能并不怎么好理解,下面来举个栗子说明什么是函数柯里化。
- var obj = {
- name: "aaaaaaaaaa"
- };
- var name = "bbb";
- function fn(n1, n2) {
- console.log(this.name);
- console.log(n1 + n2);
- }
- setTimeout(fn.bind(obj, 1, 2), 2000);
我们都知道bind函数作用与call和apply作用相似,但是与他们不同的是,bind函数不立即执行,而是简单的对函数做了一个预处理(加工)。等待调用的时候才执行。
但是这个函数方法并不兼容IE6-8,接下来我们自己实现一个myBind函数,功能类似bind
- function myBind(fn, context) {
- var outerArg = Array.prototype.slice.call(arguments, 2);
- console.log(outerArg)
- return function() {
- fn.apply(context, outerArg);
- }
- }
- setTimeout(myBind(fn, obj, 1, 2), 2000);
主要实现思路是:首先把改变函数执行的上下文,这个我们用apply,因为后面如果要传参数,需要先截取数组,排除非参数项,得到是数组,所以就要用apply传参,call和apply的区别在这时就很明显。可以看到我们在函数中又返回了函数,如果不这样做,函数就会立即执行,那定时器就失去了意义。实际上这就体现了柯里化函数。对传入的参数做了预处理,然后再返回函数,函数调用时执行返回的函数。
接下来,我们把这个方法添加到函数对象的原型上。这里还需要改动一下,把其中的this指向改动一下。
- var obj = {
- name: "aaaaaaaaaa"
- };
- var name = "bbb";
- Function.prototype.myBind = function myBind(context) {
- var _this=this;
- var outerArg = Array.prototype.slice.call(arguments, 1);
- return function() {
- _this.apply(context, outerArg);
- }
- }
- function fn(n1, n2) {
- console.log(this.name);
- console.log(n1 + n2);
- }
- setTimeout(fn.myBind(obj, 1, 2), 2000);
到这里,你对函数柯里化的应该有了基本认识,有关函数柯里化还有更多博大精深的地方,不过你可以看到,其原理都是由基本的js知识构成的,然后通过这些基础知识才构思出来的,所以打好基础很重要。
从bind函数看js中的柯里化的更多相关文章
- JS中的柯里化(currying)
何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字命名). 柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参 ...
- JS中的柯里化(currying) 转载自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]
JS中的柯里化(currying) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpr ...
- JS中的柯里化及精巧的自动柯里化实现
一.什么是柯里化? 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术.这个技术由 C ...
- js中的柯里化
概述 今天查询事件绑定资料的时候偶然遇到了柯里化这个词,很感兴趣,于是记录下来供以后开发时参考,相信对其他人也有用. 定义 柯里化是函数式编程里面的术语,它是把接受多个参数的函数变换成接受一个单一参数 ...
- JS中的柯里化与反柯里化
先占个位 看了一天折资料,感觉清楚多了
- 浅谈JavaScript中的柯里化函数
首先,不可避免的要引经据典啦,什么是柯里化函数呢(from baidu): 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返 ...
- JavaScript中的柯里化
转载自:https://www.cnblogs.com/zztt/p/4142891.html 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Ha ...
- 【译】理解JavaScript中的柯里化
译文开始 函数式编程是一种编程风格,这种编程风格就是试图将传递函数作为参数(即将作为回调函数)和返回一个函数,但没有函数副作用(函数副作用即会改变程序的状态). 有很多语言采用这种编程风格,其中包括J ...
- javascript中利用柯里化函数实现bind方法
柯理化函数思想:一个js预先处理的思想:利用函数执行可以形成一个不销毁的作用域的原理,把需要预先处理的内容都储存在这个不销毁的作用域中,并且返回一个小函数,以后我们执行的都是小函数,在小函数中把之前预 ...
随机推荐
- BZOJ4727 [POI2017]Turysta 【竞赛图哈密顿路径/回路】
题目链接 BZOJ4727 题解 前置芝士 1.竞赛图存在哈密顿路径 2.竞赛图存在哈密顿回路,当且仅当它是强联通的 所以我们将图缩点后,拓扑排序后一定是一条链,且之前的块内的点和之后块内的点的边一定 ...
- 使用telnet访问百度
这里主要是玩一下http协议,查看http的header. 1.输入命令telnet访问百度 # telnet www.baidu.com 80 Trying 220.181.112.244... C ...
- 安装elasticsearch5.4.1集群和head插件
这里用的系统版本是CentOS6.6. 192.168.3.56 ES01 192.168.3.49 ES02 192.168.3.57 ES03 1.为三个节点安装java环境 # yum inst ...
- Codeforces 901C. Bipartite Segments(思维题)
擦..没看见简单环..已经想的七七八八了,就差一步 显然我们只要知道一个点最远可以向后扩展到第几个点是二分图,我们就可以很容易地回答每一个询问了,但是怎么求出这个呢. 没有偶数简单环,相当于只有奇数简 ...
- day7-python基础
- OpenCV入门指南----人脸检测
本篇介绍图像处理与模式识别中最热门的一个领域——人脸检测(人脸识别).人脸检测可以说是学术界的宠儿,在不少EI,SCI高级别论文都能看到它的身影.甚至很多高校学生的毕业设计都会涉及到人脸检测.当然人脸 ...
- gdb调试3_显示变量 和 数组
http://www.cnblogs.com/shipfi/archive/2008/08/04/1260293.html 感谢作者! 程序变量查看文件中某变量的值:file::variablefu ...
- kibana做图表无法选取需要选的字段
kibana做图表无法选取需要选的字段,即通过term的方式过滤选择某一个field时发现列表里无此选项. 再去discover里看,发现此字段前面带有问号,点击后提示这个字段未做索引,不能用于vis ...
- bzoj千题计划155:bzoj3543: [ONTAK2010]Garden
http://www.lydsy.com/JudgeOnline/problem.php?id=3543 枚举每一个点,作为左下角 然后枚举 相同的x坐标,y坐标 少的那个 作为另一个角 二分判断另外 ...
- Fiddler 使用
一.模拟post请求 User-Agent: FiddlerContent-Type: application/json; charset=utf-8Content-Length: 138Conten ...