Javascript中apply()和call()方法

Author : lovecicy

最近在看Raphael,在Demo中发现了一段很有趣的代码,用来求数组中的最小值:

Math.min.apply(Math,array);

后来和cicy交流,发现apply方法还有一个很妙的用法,于是准备写一篇关于apply()和call()方法的文章。

一、apply()和call()方法的定义

call()和apply()方法的加入是为了解决javascript流行的继承机制的弊端,用于对象冒充。关于继承机制的简单介绍,可以看这里

call()方法的使用:

call(thisObj,pram1,pram2,...)

第一个参数用作被调用方法的this对象,其他参数则作为被调用方法的参数。例如:

function callTest(x,y){
    console.log('this.value is :'+this.value+';');
   console.log('x = '+x+'; y = '+y);
}
a = {name:'testObj',value:'testObjValue'};
callTest(1,2)  //输出: this.value is undefined;x = 1; y = 2
callTest.call(a,1,2)  //输出: this.value is testObjValue;x = 1; y = 2

先说第一个callTest()方法调用,直接方执行callTest()方法时,由于没有对象显示调用了此方法,因此方法内部的this指向window对象,因为window对象没有value属性,因此输出是undefined。而第二个callTest()方法调用时使用了call方法,这样在执行时,就会将callTest()方法执行时的this指向第一个参数a,所以输出this.value is testObjValue。

apply()方法的使用:

apply(thisObj,pramArray)

与call()方法类似,apply()方法的第一个参数也是作为被调用方法的this对象被传入,不同的是apply只接收两个参数,第二个参数是一个数组,数组的每个元素将被作为参数传递给被调用的方法,实质上与call()方法的调用效果是一样的,只是传递参数的形式不同。

二、apply()方法的妙用

文章开头提到了求数组中最小值的方法,就是apply()方法的妙用。Math.min()方法接收多个参数,计算并返回参数中的最小值。

通常情况下,要计算数组的最小值,需要使用一个循环,在循环内用Math.min()方法比较两个值的大小,同时需要判断数组是否到最后。但是,使用开头的方法,通过给apply()方法传递一个数组,apply()方法会负责将数组内所有元素作为参数传递给Math.min()方法,只需要一条语句就可以完成,求最大值也是同样的方法。

apply()方法还有一个巧妙的用法,就是将一个数组并入另一个数组。通常的做法是通过一个循环,每次调用数组的push方法,将一个值加入数组末尾,但是使用apply()方法,就可以一次性将数组并入另一个数组:

Array.push.apply(arrayA,arrayB);

这样就可以达到合并数组的目的。当然,这样会改变arrayA,如果要得到合并后的数组并且不改变arrayA和arrayB,则可以使用Array对象的concat()方法,此方法不会影响原数组,只会返回合并后的数组。

standard
  1. Cicy - 2013 年 4 月 19 日 1:14 下午

    沙发~~

    回复
    • YuC - 2013 年 4 月 19 日 1:14 下午

      呵呵

      回复

Have your say