以下是百度百科对柯里化函数的解释:柯里化(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中的柯里化的更多相关文章

  1. JS中的柯里化(currying)

    何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字命名). 柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参 ...

  2. JS中的柯里化(currying) 转载自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]

    JS中的柯里化(currying) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpr ...

  3. JS中的柯里化及精巧的自动柯里化实现

    一.什么是柯里化? 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术.这个技术由 C ...

  4. js中的柯里化

    概述 今天查询事件绑定资料的时候偶然遇到了柯里化这个词,很感兴趣,于是记录下来供以后开发时参考,相信对其他人也有用. 定义 柯里化是函数式编程里面的术语,它是把接受多个参数的函数变换成接受一个单一参数 ...

  5. JS中的柯里化与反柯里化

    先占个位 看了一天折资料,感觉清楚多了

  6. 浅谈JavaScript中的柯里化函数

    首先,不可避免的要引经据典啦,什么是柯里化函数呢(from baidu): 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返 ...

  7. JavaScript中的柯里化

    转载自:https://www.cnblogs.com/zztt/p/4142891.html 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Ha ...

  8. 【译】理解JavaScript中的柯里化

    译文开始 函数式编程是一种编程风格,这种编程风格就是试图将传递函数作为参数(即将作为回调函数)和返回一个函数,但没有函数副作用(函数副作用即会改变程序的状态). 有很多语言采用这种编程风格,其中包括J ...

  9. javascript中利用柯里化函数实现bind方法

    柯理化函数思想:一个js预先处理的思想:利用函数执行可以形成一个不销毁的作用域的原理,把需要预先处理的内容都储存在这个不销毁的作用域中,并且返回一个小函数,以后我们执行的都是小函数,在小函数中把之前预 ...

随机推荐

  1. 解题:CQOI 2017 老C的任务

    题面 找到真正的KD-Tree题目了!然而出题人并不打算放KD-Tree过,只能O2了 // luogu-judger-enable-o2 #include<cstdio> #includ ...

  2. fzyzojP2984 -- 序列变换问题

    一个区间缩小变换的问题,并且n<=300 启示我们区间dp 我们考虑最后一定是在原串上扣一些,剩一些 所以不妨前求出[l,r]把[l,r]完全处理成什么样子的方案数 然后再来一遍序列dp,统计答 ...

  3. js正则取出一个字符串小括号中的内容

    var aa="ldfjsldfj(dsfasjfj3124123)"; var result = aa.match(/\(([^)]*)\)/); // 此时result=[&q ...

  4. 2017易观OLAP算法大赛

      大赛简介   目前互联网领域有很多公司都在做APP领域的“用户行为分析”产品,与Web时代的行为分析相类似,其目的都是帮助公司的运营.产品等部门更好地优化自家产品,比如查看日活和月活,查看渠道来源 ...

  5. my-innodb-heavy-4G.cnf配置文件注解

    [client] ####客户端 port = 3306 ####mysql客户端连接时的默认端口号 socket = /application/mysql-5.5.32/tmp/mysql.sock ...

  6. rsync命令的基本使用

    rsync命令的基本使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. rsync服务软件是一款开源,高速的,数据同步(拷贝)工具. 一.rsync服务的特点 1>.本地拷贝 ...

  7. css overflow用法

    1. overflow-y: auto 侧边栏滚动效果:overflow-y:auto 2. overflow-y: scroll 如果使用overflow:scroll的话,滚动条就一直都在,页面不 ...

  8. iScroll使用方法

    最基本的iScroll使用结构 <div id="wrapper"> <ul> <li></li> ..... </ul> ...

  9. Java入门系列(三)面向对象三大特性之封装、继承、多态

    面向对象综述 封装 封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项,或者叫接口. 有了封装,就可以明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者:而外部调用者也可以知道 ...

  10. VC++的全局变量(转)

    全局变量一般这样定义:1.在一类的.cpp中定义 int myInt;然后再在要用到的地方的.cpp里extern int myInt:这样就可以用了. 2.在stdafx.cpp中加入:int my ...