手写源码实现apply方法

359 阅读1分钟

/*

了解apply的用处

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

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

4.和call不同的是:第二个参数传入的是数组或者类数组的集合,虽然以一个集合的形式传过去的,但是fn接收时还是散乱的接收的

*/

function fn(){

  console.log([...arguments]);

   console.log(this);//查看this指向是否改变

}

var obj = {

  a:12,

  b:13

}

Function.prototype.myApply = function myApply(context,arg){//接收的是一个集合

     //this 就是 fn

     //this(...ary)//扩展运算符
     //让fn(this).fn执行并且让函数中的this指向是context
     //context.qqq() qqq执行时 里边的this是context

     arg = arg || [];//不传参数就是空数组

     context = context || window;//不传参数就是window

     let a = Symbol();//产生一个唯一不重复的值

     context[a] = this;//直想改为this

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

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

}

fn.myApply(obj,[3,4]);