猿问

实现bind函数的柯里化问题

快速实现一个一般是:


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,柯里化?


请大神举下具体场景讲解下。感谢


函数式编程
浏览 778回答 4
4回答

一只萌萌小番薯

原生的bind是可以使一个函数具有预设初始参数,也就是实现偏函数function sum(a, b) {    console.log(a + b)}var sum2 = sum.bind(null,2);   // 固定参数a, 值为2sum2(4)                        // 传入参数b, 值为4, 结果为6而你模仿实现的第一个bind方法不具有这个功能,往bind返回的函数(sum2)传参并没有效果。第二个bind方法就实现了这种预设初始参数的功能。sum2函数传入参数4,参数会被收集,并跟一开始使用bind方法传入的参数2合并到一起,然后再传给sum函数. 实现了sum(2, 4)的效果.MDN上有bind关于偏函数的应用讲解,可以再去看看.有讲得不好的地方,请指出.

慕哥9229398

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

阿波罗的战车

你的第一种 调用新函数 参数无用function test(a){    console.log(a);}var newTest = test.bind();newTest(1);

繁华开满天机

    function a () {console.log(arguments)}    // 上面两种bind试一下运行,就可以看到差别了    var b = a.bind(null, 1, 2)    b(3,4)
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答