手写源码实现call方法

695 阅读1分钟

/*

首先了解call()的作用

1.可以让代码立即执行

2.可以改变函数执行时内部的this指向

3.this指向了call的第一个实参,call后边的所有参数,都被作为了实参传给了前边的函数

 提一下:Object.prototype.toString.call();//将obj的指向改成了你传的参数指向

*/

function fn(){

   console.log(arguments);

   console.log(this);

}

var obj ={

   a:12,

   b:13,

   f:fn

}

Function.prototype.myCall = function myCall(context,...arg){//剩余运算符

     //this 就是 fn

    // 让fn(this).fn执行并且让函数中的this指向context

    // context.qqq():  qqq执行时 里边的this指向就是context

   context = context || window;//不传参数的时候默认就是window

   let a = symbol();//symbol产生一个唯一不重复的值,防止命名冲突

   context[a] = this;//context.qqq --->this

   let res = context[a](...arg);//让 fn 执行并拿到传的参数

   delete context[a];//删除增加了的qqq属性

   return res;//返回获取的参数结果

}

fn.myCall(obj,6,6,6)