美文网首页
自己实现call方法

自己实现call方法

作者: yanmingfei | 来源:发表于2019-07-31 14:09 被阅读0次

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;
}

相关文章

网友评论

      本文标题:自己实现call方法

      本文链接:https://www.haomeiwen.com/subject/ikbzrctx.html