手写call方法

关键字: call, Function.prototype.call
自己来实现一个call方法。
语法:fn.call([context],[arg1]....);

call干了些啥?

  1. 绑定this到第一个实参
  2. 执行函数并返回结果
(function(){
  function call(context){
    // this => fn当前要操作的函数
    // 列如fn.call()
    context.$fn = this;
    let resutl,args = [];
    //处理余下参数
    for (let i = 1; i < arguments.length; ++i) {
      args.push(arguments[i]);
    }
    result = context.$fn(...args);
    // 用完后就删除
    delete context.$fn;
    return result;
  }
  // 扩展到Function原型上去
  Function.prototype.mycall = call;
})();

// 00-------------------------测试代码--------------------
let obj = {
  name:'OBJ'
}
window.name = "WINDOW"
function fn(){
  console.log(this.name);
}
fn(); // => this:window 
// 使用自己实现的call=>mycall
fn.mycall(obj) // => this:obj
/**
	WINDOW
	OBJ
*/

以上实现的缺点:

  • 不能接受基本类型的值

  • 没有处理不传入第一个参数,或者传入第一个参数为null或者undefined

posted @ 2021-02-02 21:29  HelloCoderRookie  阅读(527)  评论(0编辑  收藏  举报