js中apply()和call()的区别
2016-03-29 21:28
246 查看
PS:阿里面试还是跪掉了,跪就跪吧,心情有点小郁闷,不过还是要好好总结和思考,多努力!
主要考虑一下几个问题:
不同点:方法传递的参数不同
call, apply方法区别是,从第二个参数起, call方法参数将依次传递给借用的方法作参数, 而apply直接将这些参数放到一个数组中再传递, 最后借用方法的参数列表是一样的.
apply方法应用某一个对象的方法,用另一个对象替换当前对象。
ps:如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
call方法调用一个对象的一个方法,以另一个兑现个替换当前对象。
意思一样不过参数列表不一样
例子来自博客:http://blog.csdn.net/business122/article/details/8000676
Person.apply(this,arguments);
this:在创建对象时指的是student;arguments是一个数组[“qian”,21,”一年级”],即用student去指向Person这个类里面存在this.name等之类的语句,这样就将属性创建到了student对象里面。
主要考虑一下几个问题:
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));
相关文章推荐
- Unity中简单使用Opengl
- WebView的使用
- Unity中简单使用Opengl
- iOS个人整理35-即时通信1 XMPP openfire 登录注册
- Android Studio--android:descendantFocusability用法简析
- Unity Shaders and Effects Cookbook (2-7)实现 Photoshop 色阶效果
- 【Coursera】Machine learning - week6 : Advice for Applying Machine Learning
- 安卓学习笔记(三)使用Intent在活动中穿梭
- 类似于微信发语音Demo
- Android自定义ImageView实现圆形控件显示
- WKWebView的基本使用,与网页h5交互,解决self不释放的问题
- Cocos2d-X学习——Android移植,使用第三方库.so被删掉问题
- Swift 2.0 裁剪字符串以及Int和String转化
- Android---加载图片 解决图片过大导致的内存溢出问题
- iOS label自适应大小
- Android 自定义View (一)
- 开发android应用需要掌握哪些知识呢?
- iOS多线程开发系列之(二)NSOperation
- (1)app图标问题
- Android绘图drawText垂直居中与FontMetrics