实现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))
    }
}

但是最近看了一篇文章,说这种会
clipboard.png
预设参数功能丢失是什么意思?

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

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

阅读 2.7k
4 个回答

原生的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关于偏函数的应用讲解,可以再去看看.

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

预设参数就是你开始绑定的时候,指定的前面的参数,后面就不需要再传了
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)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题