apply与call共同点在于,一经调用自动执行,不同点在于传递参数的方式,call传递的是参数列表(逗号分割,依次传参),apply传递的是数组(明文要求)
那么我们就在imicall函数的基础上进行逻辑的叠加(不知道imicall函数的请到我的文章--js手撕this绑定--模拟call函数的实现查看)
既然接收的数组,那么我们就设置一个接收数组的形参。
再然后需要考虑的就是这个形参的边界了,如果它为空会如何,它为undefined或者null会如何,如果它只需要传递一个参数会如何?
所以解决办法如下:一看就懂!
Function.prototype.imiapply=function(obj,args){ if(obj!==0){ obj=obj?Object(obj):window }else{ obj=Object(obj) } let fn=this obj.fn=fn args=args||[] let result=obj.fn(...args) delete obj.fn return result } function sum(num1,num2){ console.log("sum:",this); return num1+num2 } var obj={name:'xwl'} var result1=sum.imiapply(obj,[10]) var result2=sum.imiapply(undefined,[20,30]) var result3=sum.imiapply(obj) console.log(result1); console.log(result2); console.log(result3);
结果如下: