javascript软绑定

说道软绑定,那么不得不首先提到什么是硬绑定,如Function.prototype.bind,就是硬绑定,有如下代码:

let obj1 = {
    id:'obj1'
},
obj2 = {
    id: 'obj2'
};

function print(){
    console.log(this.id)
}
let p1 = print.bind(obj1);
p1() // 输出 obj1
let p2 = p1.bind(obj2);
p2() // 依然输出 obj1 

这就是硬绑定的演示。一个函数一旦使用bind绑定过上下文,那么之后再绑定就不会生效了。
我这里要实现的软绑定,则就是为了某些特别需求而实现可以重复绑定的bind

Function.prototype.softBind = function(ctx,...cur){
  let fn = this
  function ret(...arg){
    return ret.fn.apply(ctx,[...ret.arg,...arg])
  }
  ret.fn = this.fn || this
  // 不要忽视对参数的绑定
  ret.arg = [...(this.arg || []),...cur]
  return ret
}

但这种实现方式会对外暴露fn和arg,存在被污染的可能性