为了账号安全,请及时绑定邮箱和手机立即绑定

实现bind函数的柯里化问题

实现bind函数的柯里化问题

函数式编程 2019-03-19 17:13:41
快速实现一个一般是:Function.prototype.bind = function (context) {    var me = this;    var argsArray = Array.prototype.slice.call(arguments);    return function () {        return me.apply(context, argsArray.slice(1))    }}但是最近看了一篇文章,说这种会预设参数功能丢失是什么意思?Function.prototype.bind = Function.prototype.bind || function (context) {    var me = this;    var args = Array.prototype.slice.call(arguments, 1);    return function () {        var innerArgs = Array.prototype.slice.call(arguments);        var finalArgs = args.concat(innerArgs);        return me.apply(context, finalArgs);    }}为什么还要搞一个innerArgs,柯里化?请大神举下具体场景讲解下。感谢
查看完整描述

4 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

原生的bind是可以使一个函数具有预设初始参数,也就是实现偏函数


function sum(a, b) {

    console.log(a + b)

}


var sum2 = sum.bind(null,2);   // 固定参数a, 值为2

sum2(4)                        // 传入参数b, 值为4, 结果为6

而你模仿实现的第一个bind方法不具有这个功能,往bind返回的函数(sum2)传参并没有效果。

第二个bind方法就实现了这种预设初始参数的功能。sum2函数传入参数4,参数会被收集,并跟一开始使用bind方法传入的参数2合并到一起,然后再传给sum函数. 实现了sum(2, 4)的效果.


MDN上有bind关于偏函数的应用讲解,可以再去看看.


有讲得不好的地方,请指出.


查看完整回答
反对 回复 2019-03-24
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

预设参数就是你开始绑定的时候,指定的前面的参数,后面就不需要再传了
innerArgs是你后面调用的时候,传的参数

查看完整回答
反对 回复 2019-03-24
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

你的第一种 调用新函数 参数无用


function test(a){

    console.log(a);

}


var newTest = test.bind();

newTest(1);


查看完整回答
反对 回复 2019-03-24
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

    function a () {console.log(arguments)}

    // 上面两种bind试一下运行,就可以看到差别了

    var b = a.bind(null, 1, 2)

    b(3,4)


查看完整回答
反对 回复 2019-03-24
  • 4 回答
  • 0 关注
  • 777 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信