关于call、apply、bind

关于call、apply、bind

关于这三个方法我们先总结一下他们的异同:

  1. apply,call,bind三者都是用来改变函数的this对象的指向的
  2. apply,call,bind三者第一个参数都是this要指向的对象,也就是想制定的上下文
  3. apply,call,bind三者都可以利用后续参数传参
  4. apply,call是立即调用的,bind是返回对应函数,便于稍后调用

    首先出场的是apply和call

    在JS中,call和apply都是为了改变某个函数运行时的上下文而存在的,换句话说,就是为了改变函数内部this的指向。
    先来举一个例子:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    fruits.prototype = {
    color:'red',
    say:function(){
    console.log("My color is "+this.color)
    }
    }
    var apple = new fruits
    apple.say() //My color is red

此时函数中的this就是指向fruits的原型链中的color,如果现在有一个对象bannan={color:yellow},我们不想对他重新定义say方法,那么我们可以通过call或者apply的say方法:

1
2
3
4
5
6
7
8
9
10
11
12
fruits.prototype = {
color:'red',
say:function(){
console.log("My color is "+this.color)
}
}
var apple = new fruits
apple.say() //My color is red
var banana = {color:'yellow'}
apple.say.call(banana) //My color is yellow
apple.say.call(banana) //My color is yellow

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

两者有什么区别呢?

没什么区别,只不过是接受参数的方式不太一样。当你不确定两者有什么区别的时候,就只用一种就好了,反正功能是一样的。就好比问你,叉子和筷子的功能有什么区别,没什么区别,都是把食物放到嘴里面,你硬是要问有什么区别,大概最主要的区别是盘子里的食物不同吧。