call、apply、bind方法的使用

call 和 apply 是为了动态改变 this 而出现的,当一个object 没有某个方法,但是其他的有,我们可以借助 call 和 apply 用其他对象的方法来操作。

知乎简单易懂答案
猫吃鱼狗吃肉,奥特曼打怪兽
有一天,狗想吃鱼了
猫.吃鱼.call (狗,鱼)
狗就吃到鱼了
猫成精了,想打怪兽
奥特曼.打怪兽.call(猫,小怪兽)
obj.call(thisObj, arg1, arg2, ...)
obj.apply(thisObj, [arg1, arg2, ...])
两者作用一致,都是把 obj (即this)绑定到 thisObj,这时候 thisObj 具备了obj 的属性和方法。
或者说 thisObj 继承了obj 的属性和方法。唯一区别是 apply 接受的是数组参数,call 接受的是连续参数

例子

var obj = {
  value: 1
}
function say() {
  console.log(this.value)
}
say()     // 输出 undefined
say.call(obj)    // 输出 1

注意两点:call 改变了 this 的指向,此时的 this 指到了 obj say 函数执行了

bind 方法的特殊性

var obj = {
  x: 81
}
var foo = {
  getX: function() {
    return this.x
  }
 }
console.log(foo.getX.bind(obj)())           // 81
console.log(foo.getX.call(obj))               // 81
console.log(foo.getX.apply(obj))            // 81

使用 bind 只是返回了对应函数并没有立即执行, 而 call 和 apply 方法是立即执行的。

你可能感兴趣的:(call、apply、bind方法的使用)