文章参考来自:https://segmentfault.com/a/1190000006993545

       :https://segmentfault.com/a/1190000004156277

其实这三个都是为了改变this的指向,apply、call两者比较相似,就只是传入的参数类型不同而已,

call在接收指定参数的形式是someMethod.call(obj, arg1, arg2);而apply在接收指定参数时的形

式是someMethod.apply(obj, [arg1, arg2]).或者someMethod.apply(obj, arg1),但是这个

arg1必须是一个类数组对象

1 function add(c, d){
2     return this.a + this.b + c + d;
3 }
4 var o = {a:1, b:2};
5 add.call(o, 3, 4); // 10
6 add.apply(o, [5, 6]); // 14

从上可以看出两个函数传入参数的不同,对于改变this的指向,看下面的例子会更生动

 1             var person1={
 2                 name:"lilei",
 3                 saysomething:function(hobby){
 4                     console.log(this.name+" like "+hobby);
 5                 }
 6             };
 7             var person2={
 8                 name:"tonny"
 9             }
10             
11             person1.saysomething('ball');//lilei like ball;其this指向为对象person1
12 
13 
14             //下面运用两个方法改变其this指向
15             person1.saySomething.apply(person2,['swimming']);//1
16             person1.saysomething.call(person2,'swimming');//2
17             //本来saysomething中的this指向是person1,但是调用了call/apply,this指向了person2
18             //上面的apply、call方法(1、2)也可以理解为
19             //person2.saySomething('swimming');

 

然后是bind,ECMAScript 5引入了Function.prototype.bind。调用f.bind(someObject)会产生一个新的函数对象。在这个新的函数对象中,this被永久绑定到了bind的第一个参数上面,无论后期这个新的函数被如何使用。还是用上面的例子

1        var person3={
2                 name:"Mike"
3             }
4             var per=person1.saysomething.bind(person3,'computer game');
        //saysomething中的this指向person3.bind与前两者的区别也在于bind是返回一个新的函数,需要再执行(即下一步)才会显示,而前两个直接使用就显示。 5 per();//Mike like computer game.

 可以看看apply的妙用

Math.max(1,2,3)可以求的最大值,但是如果是一个数组要求最大值呢,Math.max(arr)这样确实不行的,所以能用的办法只有for循环,但是有了apply就可以轻松简单的取到最大值了,即 Math.max.apply(null,arr)就可以得到数组arr的最大值,最小值也同理。