this:this指向的永远是调用该方法的对象
call和apply却可以改变this的指向,比如我们现在新建一个空对象Dog
然后用dog去调用Person的say方法
从下面的图可以看出来,Dog执行了say方法,并且他打印出来的this对象是Dog自己
call()
function.call(obj,arg1,arg2,arg3)
1.调用call的对象必须是个函数function
2.call的第一个参数将会是function改变上下文后指向的对象。如果不传,将会默认是全局对象window
第二个参数开始可以接收任意个参数,这些参数将会作为function的参数传入function
apply()
function.apply(obj[,argArray])
与call方法的使用基本一致,但是只接收两个参数,其中第二个参数必须是一个数组或者类数组,这也是这两个方法很重要的一个区别
*apply的一个巧妙的用处,可以将一个数组默认的转换为一个参数列表[param1,param2,param3] 转换为 param1,param2,param3)
*js伪数组的一些理解
apply中的arguments是一个为数组,什么是伪数组?就是有数组的一些类似属性,但是他确是一个对象,如下图可以看到
所以,如果这个伪数组用不了数组的一些方法,就可以通过Array.prototype.xxxfunction.apply(obj,一个伪数组)