浅析call和apply

概述:

今天咱们讲一个在我们工做中不常常用,可是却在面试中常常被问到的方法:call方法和apply方法。

call方法:

call方法:调用一个对象的一个方法,以另外一个对象替换当前对象。
调用方法:call([thisObj,obj1,obj2....])
看下面的例子:
1
2
3
4
5
6
7
8
9
10
function add(a,b)
{
     alert(a+b);
}
function sub(a,b)
{
     alert(a-b);
}
 
add.call(sub,3,1); //4
结果是“4”,call 方法能够用来代替另外一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 说的在直白点,上面例子中,把add放到了sub中执行,因此a+b = 4。 若是没有提供 thisObj 参数,那么 Global 对象被用做 thisObj。

apply方法:

apply方法的意思和call差很少,惟一的区别就是传递的参数是个数组。
调用方法:call([thisObj,[argArray]])
看下面的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function test1(name,age)
     {
         this .name=name;
         this .age=age;
     }
/*定义一个学生类*/
function test2(name,age,grade)
     {
         test1.apply( this ,arguments);
         this .grade=grade;
     }
//建立一个学生类
var test3= new test2( "uw3c" ,24, "一年级" );
//测试
alert( "name:" +test3.name+ "\n" + "age:" +test3.age+ "\n" + "grade:" +test3.grade);
你们确定会惊奇的发现,
this:在建立对象在这个时候表明的是student
arguments:是一个数组,也就是["uw3c","24",”一年级”];
也就是通俗一点讲就是:用test3去执行test1这个类里面的内容,在test1这个类里面存在this.name等之类的语句,这样就将属性建立到了test3对象里面
 

何时用call方法、apply方法:

在给对象参数的状况下,若是参数的形式是数组的时候,好比apply示例里面传递了参数arguments, 这个参数是数组类型,而且在调用test1的时候参数的列表是对应一致的(也就是test1和test2的参数列表前两位是一致的) 就能够采用 apply , 若是个人test1的参数列表是这样的(age,name),而test2的参数列表是(name,age,grade),这样就能够用call来实现了,也就是直接指定参数列表对应值的位置。
相关文章
相关标签/搜索