apply与call作用是一样,只是传参形式不同,只拿apply说明
一、用法fn1.apply(fn2,[parm1,parm2,..])
说明:执行fn1这个方法,参数是parm这些。
特点:多了一个调用者fn2.
原理,拿fn1的内容到fn2函数里面运行一次。
利用这一个特性有以下用途:
1)改变this的指向:
原理:fn1里面如何含有this关键字,那么this的指向,将会由于在在fn2体内运行,从而相当于fn2调用fn1的方法,最后将会导致fn1中的this指向fn2.
2)fn2继承fn1:
原理:由于fn1在fn2体内运行过一次,假如fn1里面封装了方法与属性,相当于把fn1的这些东西加到了fn2里面。
3)利用apply的两个特性巧妙解决问题,特性1->附加一个调用者,特性2->把数组作为参数:
(a,b,c三个方法的参数都不支持数组的方式传入)
a)Math.max 通过apply可以实现得到“数组”中最大的一项
b)Math.min 可以实现得到“数组”中最小的一项
c)Array.prototype.push 可以实现两个“数组”合并
提示:a和b问题只需要利用“特性1”,c需要利用“特性 1”和“特性2”
---------------------------------------------------------------------------------------------
心得:fn1();可以写成fn1.call()