自己实现call方法

call方法的目的是为了改变this指向问题。

function fn1(){
  console.log(1)
}
function fn2(){
  console.log(2)
}
fn1.call(fn2) //1

如何实现呢?

首先我们可以考虑一个问题,this指向在对象中是如何表明的呢?很简单

var name = '小王'
var obj = {
  name:'小李',
  say(){
    console.log(this.name);
  }
}
obj.say();//小李
var fn = obj.say
fn();小王

上面之所以会打印小李或者小王,在于函数执行前面有没有对象,如果没有对象,则指向window;那也就说明了,我们可以通过调用函数时,改变this指向通过它的调用者的对象来改变。那么call方法我们也可以借助于这一点来实现。

通过代码来实现call方法

Function.prototype.call = function(context){
  if(typeof this !== 'function'){
    throw new Error('这不是一个函数')
  }
  //这一步的目的是为了如果context是字符串,则把它变成 包装对象来使用。如果context没传参数则用window。
  context = context?Object(context):window;
  context.fn = this; //把this当前函数变为context的一个方法。
  var args = [...arguments].slice(1);
  let res = context.fn(args); //再让方法执行,那么context.fn中的this指向已经指向了context
  delete context.fn;
  return res;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容