在JavaScript中call()与apply()区别


Posted in Javascript onJanuary 22, 2016

如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的事偏偏就发生了,甚至觉得不可理喻.如果在学JavaScript这自由而变幻无穷的语言过程中遇到这种感觉,那么就从现在形始,请放下的您的”偏见”,因为这对您来说绝对是一片新大陆,让JavaScrip

好,言归正传,先理解JavaScrtipt动态变换运行时上下文特性,这种特性主要就体现在apply, call两个方法的运用上.

一、方法的定义

call方法:

语法:call(thisObj,Object)

定义:调用一个对象的一个方法,以另一个对象替换当前对象。

说明:

call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

apply方法:

语法:apply(thisObj,[argArray])

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

说明:

如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。

如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

--------------------------------------------------------------------------------

注意:call和apply方法完全一致,只是apply在传参的方式上,它以数组方式来传参。

代码示例:

function Animal(name) {
this.name = name;
this.showName = function() {
console.log(this.name);
};
}
function Cat(name) {
Animal.call(this, name);
}
Cat.prototype = new Animal();
function Dog(name) {
Animal.apply(this, name);
}
Dog.prototype = new Animal();
var cat = new Cat("Black Cat"); //call必须是object
var dog = new Dog(["Black Dog"]); //apply必须是array
cat.showName();
dog.showName();
console.log(cat instanceof Animal);
console.log(dog instanceof Animal);

-------------------------------------------------------------------------------

模拟call, apply的this替换

function Animal(name) {
this.name = name;
this.showName = function() {
alert(this.name);
};
};
function Cat(name) {
this.superClass = Animal;
this.superClass(name);
delete superClass;
}
var cat = new Cat("Black Cat");
cat.showName();

总结:

它们各自的定义:

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

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

它们的共同之处:

都“可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。”——摘自JScript5.5 .chm

它们的不同之处:

apply:最多只能有两个参数——新this对象和一个数组 argArray。如果给该方法传递多个参数,则把参数都写进这个数组里面,当然,即使只有一个参数,也要写进数组里面。如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

call:则是直接的参数列表,主要用在js对象各方法互相调用的时候,使当前this实例指针保持一致,或在特殊情况下需要改变this指针。如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

更简单地说,apply和call功能一样,只是传入的参数列表形式不同:如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])

Javascript 相关文章推荐
prototype Element学习笔记(篇一)
Oct 26 Javascript
javascript笔记 String类replace函数的一些事
Sep 22 Javascript
JQuery中使用Ajax赋值给全局变量异常的解决方法
Jan 10 Javascript
javascript异步处理工作机制详解
Apr 13 Javascript
javascript点击按钮实现隐藏显示切换效果
Feb 03 Javascript
基于bootstrap的选择框插件icheck
Dec 23 Javascript
jQuery基于Ajax方式提交表单功能示例
Feb 10 Javascript
JavaScript实现音乐自动切换和轮播
Nov 05 Javascript
vue将毫秒数转化为正常日期格式的实例
Sep 16 Javascript
学习使用ExpressJS 4.0中的新Router的用法
Nov 06 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
Oct 29 Javascript
js实现盒子移动动画效果
Aug 09 Javascript
很全面的JavaScript常用功能汇总集合
Jan 22 #Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
Jan 22 #Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
Jan 22 #Javascript
JavaScript学习笔记整理之引用类型
Jan 22 #Javascript
jQuery弹层插件jquery.fancybox.js用法实例
Jan 22 #Javascript
基于JS实现新闻列表无缝向上滚动实例代码
Jan 22 #Javascript
jQuery validate插件实现ajax验证重复的2种方法
Jan 22 #Javascript
You might like
PHP在不同页面间传递Json数据示例代码
2013/06/08 PHP
php生成静态页面的简单示例
2014/04/17 PHP
Laravel框架实现的记录SQL日志功能示例
2018/06/19 PHP
PHP基于openssl实现的非对称加密操作示例
2019/01/11 PHP
用javascript编写的第一人称射击游戏
2007/02/25 Javascript
JavaScript 异步调用框架 (Part 3 - 代码实现)
2009/08/04 Javascript
jQuery ajax调用WCF服务实例
2014/07/16 Javascript
jQuery过滤HTML标签并高亮显示关键字的方法
2015/08/07 Javascript
javascript实现数组中的内容随机输出
2015/08/11 Javascript
基于Javascript实现倒计时功能
2016/02/22 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
webuploader分片上传的实现代码(前后端分离)
2018/09/10 Javascript
js实现动态增加文件域表单功能
2018/10/22 Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
2018/11/10 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
[09:13]2014DOTA2国际邀请赛 中国区预选赛coser表演
2014/05/23 DOTA
学习python的几条建议分享
2013/02/10 Python
Python内置函数dir详解
2015/04/14 Python
python版本坑:md5例子(python2与python3中md5区别)
2017/06/20 Python
Python常见工厂函数用法示例
2018/03/21 Python
Python查找第n个子串的技巧分享
2018/06/27 Python
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
python2和python3哪个使用率高
2020/06/23 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
2020/11/01 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
2020/12/21 Python
人力资源主管的岗位职责
2014/03/15 职场文书
局火灾防控工作方案
2014/05/25 职场文书
安全宣传标语口号
2014/06/06 职场文书
初级党校心得体会
2014/09/11 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书
关于学习的决心书
2015/02/05 职场文书
档案管理员岗位职责
2015/02/12 职场文书
帝企鹅日记观后感
2015/06/10 职场文书
退休职工欢送会致辞
2015/08/01 职场文书