apply、bind、call 三者的区别
三者异同
+-----------------+-----------------+----------------+
|                 |   函数执行时间    |   this绑定时间  |
+-----------------+-----------------+----------------+
| function object |       未        |       未        |
|        f        |       来        |       来        |
+-----------------+-----------------+----------------+
| function call   |       现        |       现        |
|      f()        |       在        |       在        |
+-----------------+-----------------+----------------+
|    f.call()     |       现        |       现        |
|    f.apply()    |       在        |       在        |
+-----------------+-----------------+----------------+
|    f.bind()     |      未来        |      现在      |
+-----------------+-----------------+----------------+
相同点
- 都是 Function对象上的方法 ,为了改变函数体内部的this指向
- 三者第一个参数都是 this要指向的对象,即指定函数调用上下文
- 三者都可以利用后续参数传参
不同点
- bind是指定上下文,返回函数,便于稍后调用,- apply和- call则是立即调用函数并修改上下文- bind()函数会创建一个新的绑定函数- (bound function,BF)
- 返回值:返回一个原函数的拷贝,并拥有指定的 this值和初始参数
 
- apply传入数组- 返回值:调用有指定 this值和参数的函数的结果
 
- 返回值:调用有指定 
- call传入参数列表- call()允许为不同的对象分配和调用属于一个对象的函数/方法
- 可以使用 call来实现继承:写一个方法,然后让另外一个新的对象来继承它(而不是在新对象中再写一次这个方法)
- 返回值:使用调用者提供的 this值和参数调用该函数的返回值。若该方法没有返回值,则返回undefined