如何修复自定义bind函数中arguments触发的prefer-rest-params linter错误
customBind 函数修复方案
核心问题说明
你之前替换参数后运行不符合预期,除了arguments的用法问题外,还存在func.apply的传参逻辑错误:
- 外层
customBind已经通过形参剩余参数...args接收了绑定时传入的预置参数,不需要再通过arguments截取第2位之后的内容 - 内层返回的执行函数没有声明剩余参数,导致你无法直接拿到调用时的传参
Function.prototype.apply仅接收两个参数:第一个为绑定的this上下文,第二个为参数数组,原代码末尾多余的...args属于无效错误传参
修复后代码(对齐linter要求,符合bind基础逻辑)
// 把外层的args重命名为bindArgs更语义化,可直接对应原来的bindArgs变量 export function customBind(func, context, ...bindArgs) { // 内层函数声明剩余参数callArgs,接收调用bind返回函数时传入的参数,替代arguments return function(...callArgs) { // 修正apply的传参逻辑,拼接两类参数后整体传入 return func.apply(context, bindArgs.concat(callArgs)); }; }
可选扩展(完全对齐原生Function.prototype.bind特性)
如果需要覆盖原生bind的所有特性,包括支持new调用(被new时会忽略绑定的context,this指向实例,且继承原函数原型),可以用如下完整实现:
export function customBind(func, context, ...bindArgs) { function fBound(...callArgs) { // new调用时this指向fBound的实例,此时用实例作为上下文,忽略绑定的context return func.apply( this instanceof fBound ? this : context, bindArgs.concat(callArgs) ); } // 继承原函数的原型,保证new实例的原型链正确 fBound.prototype = Object.create(func.prototype); return fBound; }
内容的提问来源于stack exchange,提问作者ivan239
相关产品推荐
相关产品推荐

