您的位置:首页 > 移动开发

js中apply()和call()的区别

2016-03-29 21:28 246 查看
PS:阿里面试还是跪掉了,跪就跪吧,心情有点小郁闷,不过还是要好好总结和思考,多努力!

主要考虑一下几个问题:

1. apply和call的区别在哪里?

相同点:两个方法产生的作用完全一样

不同点:方法传递的参数不同

call, apply方法区别是,从第二个参数起, call方法参数将依次传递给借用的方法作参数, 而apply直接将这些参数放到一个数组中再传递, 最后借用方法的参数列表是一样的.

apply方法应用某一个对象的方法,用另一个对象替换当前对象。

function.apply(obj,args)方法接收连个参数,obj这个对象代替function里的this对象,args这个数组,它将作为参数传给function(args->arguments)


ps:如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

call方法调用一个对象的一个方法,以另一个兑现个替换当前对象。

意思一样不过参数列表不一样

例子来自博客:http://blog.csdn.net/business122/article/details/8000676

1)apply实例:

<script type="text/javascript">
/*定义一个人类*/
function Person(name,age) {
this.name=name; this.age=age;
}
/*定义一个学生类*/
functionStudent(name,age,grade) {
Person.apply(this,arguments); this.grade=grade;
}
//创建一个学生类
var student=new Student("qian",21,"一年级");
//测试
alert("name:"+student.name+"\n"+"age:"+student.age+"\n"+"grade:"+student.grade);
//大家可以看到测试结果name:qian age:21 grade:一年级
//学生类里面我没有给name和age属性赋值啊,为什么又存在这两个属性的值呢,这个就是apply的神奇之处.
</script>


Person.apply(this,arguments);

this:在创建对象时指的是student;arguments是一个数组[“qian”,21,”一年级”],即用student去指向Person这个类里面存在this.name等之类的语句,这样就将属性创建到了student对象里面。

2)call示例
student函数里面可以将apply中修改如下:
Person.call(this,name,age);


2. 什么情况用apply什么情况用call?

在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments,这个参数是数组类型,并且在调用Person的时候参数的列表是对应一致的(也就是Person和Student的参数列表前两位是一致的) 就可以采用 apply , 如果我的Person的参数列表是这样的(age,name),而Student的参数列表是(name,age,grade),这样就可以用call来实现了,也就是直接指定参数列表对应值的位置(Person.call(this,age,name,grade));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: