求助:bind与apply返回结果不同的原因及自定义bind问题
为何自定义bind函数用bind替代apply时无法正常工作?
嘿,我来帮你理清楚这个问题——你在自定义bind函数时踩的坑,核心是没搞明白bind和apply/call的本质区别,以及自定义bind的正确收尾方式。
先看你的代码框架,其实已经做对了大部分逻辑:提取bind时传入的额外参数outArg,提取返回函数被调用时的参数inArg,合并成完整的参数列表allArg。问题就出在最后一步——你说“使用bind替代apply时无法正常工作”,这说明你大概率在return语句里写了类似fn.bind(thisArg, ...allArg)的代码,而这完全搞错了bind的作用。
先明确三个函数的核心差异
apply/call:是立刻执行目标函数,同时把this绑定为你指定的值,再传入参数,直接返回函数的执行结果。bind:是返回一个新函数,这个新函数已经“记住”了你指定的this和部分参数,但它不会立刻执行——你必须再调用这个新函数,它才会去执行原函数。
你的自定义bind函数的目标,就是返回一个预绑定了this和部分参数的函数。所以在返回的内部函数里,你需要立刻执行原函数fn,而不是再去调用bind(那样只会返回另一个等待调用的函数,而不是你想要的计算结果)。
修正后的自定义bind函数
正确的做法是用apply来执行fn,因为apply接受数组形式的参数,刚好匹配你合并后的allArg:
function bind(fn, thisArg){ var outArg = [].slice.call(arguments, 2); return function(){ var inArg = [].slice.call(arguments); var allArg = outArg.concat(inArg); // 用apply立刻执行fn,绑定thisArg并传入所有参数 return fn.apply(thisArg, allArg); } }
测试验证
用你的addFourNumbers函数测试一下:
function addFourNumbers(a,b,c,d){ return a+b+c+d; } // 绑定this为null(因为addFourNumbers不需要this),并传入前两个参数1和2 const boundAdd = bind(addFourNumbers, null, 1, 2); // 调用时传入剩下的两个参数3和4 console.log(boundAdd(3,4)); // 输出10,完全符合预期
如果你的环境支持ES6+,也可以用call配合展开运算符实现,效果一致:
return fn.call(thisArg, ...allArg);
额外说明
如果要完全模拟原生bind的所有特性(比如处理构造函数场景、原型链继承等),代码会更复杂,但如果只是满足你当前的需求——绑定this和支持分步传参,上面的代码就足够用了。
内容的提问来源于stack exchange,提问作者Hammad Balkhi
相关产品推荐
相关产品推荐

