一直以来都对JavaScript函数的apply或call方法,摸不着头脑。不知道它们到底有什么用处,也不知道它们的精髓在哪里。
最近因为时不时总能碰到它们,也就有了要搞清楚的决心,沉下心思考倒也有了一些成果。apply和call的区别挺小,主要就是第二个参数的形式不同,前者为参数数组,后者为参数列表。下面的内容均以apply为代表进行。
先来看两个应用实例,其一:
var arr1 = [1,2,3];
var arr2 = [4,5,6];
Array.prototype.push.apply(arr1,arr2); // => arr1.push.apply(arr1, arr2);
console.log(arr1); // [1,2,3,4,5,6]
console.log(arr2); // [4,5,6]
其二:
var arr = [100,22,0,-12,33];
var max = Math.max.apply(null, arr); // 100
var min = Math.min.apply(null, arr); // -12
JavaScript里的方法主要有静态方法,如Date.now
;实例方法,如arr.push
;全局方法,如parseInt
几种类型。不管是怎么的方法,我们都可以把它们的调用方式归结为一种形式obj1.Method(arguments)
。
Date.now() => window.Date.now()
arr.push(1)
parseInt(12.21) => window.parseInt(12.21)
也就是说,方法的调用有三个组成组分:对象、参数、方法。
arr.push(1) => arr是对象,1为参数,push为方法
对象.方法(参数)
这也是最常见的一种调用形式,但是这并不是唯一的形式。譬如,这篇文章的主人公apply,它的加入能让函数调用转换成另外一种形式:方法(对象,参数)
。
arr.push(1) => arr.push.apply(arr, [1])
arr.push.apply(arr, [1])
中,arr.push
整个表示方法,你不能写成push
,但是却可以写成Array.prototype.push
。
所以,apply的出现修改了函数调用的方式,而且调用的时候,可以传递数组为参数。