this和bind、call、apply的关系

最新的更新:重新理解它们之间的关系链接 

函数调用的关系:

const test = {
  val : 10,
  ret: function() {
    return this.val
  }
}
console.log(test.ret()) //  10

上面的代码是一个对象test,里面有属性val,方法ret,调用ret就是test.ret,其中test就充当调用者的身份,而函数中的this就是指代调用者,通常情况下,this都是指代调用者,那如果我们想将test的方法ret共给其他对象使用的时候,我们该怎么改变调用者呢?这就应用到了bind函数,它可以改变方法的调用者,如下的代码(红色是增加的代码):

const test = {
  val : 10,
  ret: function() {
    return this.val
  }
}
const test2 = {
  val: 20
}
console.log(test.ret.bind(test2)) //  ƒ () {return this.val;}

此处返回的是一个函数,我们可以直接调用它,最后可以得到的值是20, 由此我们可以总结:bind函数将调用者从test改为test2,所以返回的是20而不是10,但是并没有执行这个函数。那如果在改变调用者的同时也执行此函数呢?这里就应用了call或者apply函数,代码如下(红色是修改的代码):

const test = {
  val : 10,
  ret: function() {
    return this.val
  }
}
const test2 = {
  val: 20
}
console.log(test.ret.call(test2))  // 20
console.log(test.ret.apply(test2))   // 20

那call和apply又有什么区别呢?引用MDN的定义:the fundamental difference is that call() accepts an argument list, while apply() accepts a single array of arguments.

代码演示(红色是增加的代码):

const test = {
  val : 10,
  ret: function(num1,num2) {
    return this.val + num1 + num2
  }
}
const test2 = {
  val: 20
}
const arr = [1,2]
console.log(test.ret.call(test2, 1, 2))  // 23
console.log(test.ret.apply(test2, arr))  // 23

 

posted @ 2020-12-01 15:56  xqcokid  阅读(73)  评论(0编辑  收藏  举报