call,apply,bind
底层实现
call,apply,bind底层实现是C++代码,以下实现仅通过js进行模拟,并且不过度考虑边界情况
因此仅用于学习和加深理解
call实现
function rvcall(binding,...argArray){/*处理binding为非对象或函数以及为空情况,导致设置__rvcall__时报错TypeError: binding.__rvcall__ is not a function*/binding=binding!=null?Object(binding):window;binding.__rvcall__=this;var result=binding.__rvcall__(...argArray);delete binding.__rvcall__;return result;}Function.prototype.rvcall=rvcall;
apply实现
function rvapply(binding,argArray){/*处理binding为非对象或函数以及为空情况,导致设置__rvapply__时报错TypeError: binding.__rvapply__ is not a function*/binding=binding!=null?Object(binding):window;/*处理args为undefined或null情况,调用扩展运算符时报错TypeError: argArray is not iterable (cannot read property undefined)*/argArray=argArray?argArray:[];binding.__rvapply__=this;var result=binding.__rvapply__(...argArray);delete binding.__rvapply__;return result;}Function.prototype.rvapply=rvapply;
bind实现
function rvbind(binding,...argArray){/*处理binding为非对象或函数以及为空情况,导致设置__rvbind__时报错TypeError: binding.__rvbind__ is not a function*/binding=binding!=null?Object(binding):window;return (...newArgArray)=>{binding.__rvbind__=this;var result=binding.__rvbind__(...argArray,...newArgArray);delete binding.__rvbind__;return result;};}Function.prototype.rvbind=rvbind;
