浅谈call/apply/bind

2020-08-14  本文已影响0人  小仙有毒_1991

经常使用bind/ call/apply你是否想过他们是怎么实现的?

讲一下call的实现原理,
call 返回函数执行的结果

Function.prototype.call = function (context,...args){
  context = context === null ? window : context;//上下文
  if(!/^(object | function )$/i.test(typeof context)){
    context = Object(context);
  }
  let result;
  let key = Symbol('key');
  context[key] = this;// this 代表当前方法
  result = context[key](...args);
  delete context[key];
  return result;

思考一下bind 是如何实现的?
bind 会创建一个函数

Function.propotype.bind = function(context,...outerArgs){//outArgs bind时传入的参数
  let _this = this;// 保存this,即调用bind方法的目标函数
  return function(...innerArgs){// innerAtgs bind创建的函数执行时传入的参数 
    let args = outerArgs.concat(innerArgs);
     _this.call(context,...args );
  }
}
// ...args方案 代替了  Array.protptype.slice.call(arguments);
上一篇 下一篇

猜你喜欢

热点阅读