文章参考来自: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的最大值,最小值也同理。