call,apply,bind

底层实现

call,apply,bind底层实现是C++代码,以下实现仅通过js进行模拟,并且不过度考虑边界情况

因此仅用于学习和加深理解

call实现

  1. function rvcall(binding,...argArray){
  2. /*
  3. 处理binding为非对象或函数以及为空情况,导致设置__rvcall__时报错
  4. TypeError: binding.__rvcall__ is not a function
  5. */
  6. binding=binding!=null?
  7. Object(binding):window;
  8. binding.__rvcall__=this;
  9. var result=binding.__rvcall__(...argArray);
  10. delete binding.__rvcall__;
  11. return result;
  12. }
  13. Function.prototype.rvcall=rvcall;

apply实现

  1. function rvapply(binding,argArray){
  2. /*
  3. 处理binding为非对象或函数以及为空情况,导致设置__rvapply__时报错
  4. TypeError: binding.__rvapply__ is not a function
  5. */
  6. binding=binding!=null?
  7. Object(binding):window;
  8. /*
  9. 处理args为undefined或null情况,调用扩展运算符时报错
  10. TypeError: argArray is not iterable (cannot read property undefined)
  11. */
  12. argArray=argArray?argArray:[];
  13. binding.__rvapply__=this;
  14. var result=binding.__rvapply__(...argArray);
  15. delete binding.__rvapply__;
  16. return result;
  17. }
  18. Function.prototype.rvapply=rvapply;

bind实现

  1. function rvbind(binding,...argArray){
  2. /*
  3. 处理binding为非对象或函数以及为空情况,导致设置__rvbind__时报错
  4. TypeError: binding.__rvbind__ is not a function
  5. */
  6. binding=binding!=null?
  7. Object(binding):window;
  8. return (...newArgArray)=>{
  9. binding.__rvbind__=this;
  10. var result=binding.__rvbind__(...argArray,...newArgArray);
  11. delete binding.__rvbind__;
  12. return result;
  13. };
  14. }
  15. Function.prototype.rvbind=rvbind;