javascript中call和apply方法浅谈


Posted in Javascript onSeptember 27, 2013

call和apply的第一个实参是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对它的引用。
例如,如果要想以对象o的方法来调用函数f,可以按如下的方式使用call和apply方法:

f.call(o);

f.apply(o);

可以按如下的代码来理解:
o.m = f;
//将f存储为o的临时方法

o.m();
//调用这个临时方法

delete o.m;
//将这个临时方法删除

来个示例吧。
function testFun(){


return this.a + this.b;

}
 
var o = {a:1, b:2};

testFun.call(o);
//3

testFun.apply(o);
//3

上述代码执行的结果均为3,可以理解为return o.a + o.b。
 考虑一个问题,如果call和apply方法的第一个实参为null或者undefined为怎样?来看下面的一个例子:

var a = 10, b = 20;

function testFun(){


return this.a + this.b;

}

testFun.call();

testFun.apply();

上述代码执行的结果均为30。这是因为call和apply的第一个实参如果传入的是null或者undefined,则会被全局对象代替。
 那call和apply这两个方法有什么区别呢?
对于call方法来说,第一个调用上下文实参之后的所有实参就是要传入待调用函数的值。比如,以对象o的方法的形式调用函数f,并传入两个参数,就可以使用如下的代码:

f.call(o, 1, 2);

而apply方法则将第一个实参之后的所有实参放入一个数组内,
f.apply(o, [1, 2]);

来个例子吧
function testFun(x, y){


return this.a + this.b + x + y;

}

var o = {a:1, b:2};

testFun.call(o, 10, 20);

testFun.apply(o, [10, 20]);

 上述代码的执行结果为33,可以理解为 return o.a + o.b + 10 + 20
Javascript 相关文章推荐
些很实用且必用的小脚本代码
Jun 26 Javascript
js网页中的(运行代码)功能实现思路
Feb 04 Javascript
javascript函数定义的几种区别小结
Jan 06 Javascript
Jquery的each里用return true或false代替break或continue
May 21 Javascript
JsRender for index循环索引用法详解
Oct 31 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
May 28 Javascript
JavaScript中的bold()方法使用详解
Jun 08 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
Sep 19 Javascript
js 截取或者替换字符串中的数字实现方法
Jun 13 Javascript
jQuery中元素选择器(element)简单用法示例
May 14 jQuery
Vue开发之封装分页组件与使用示例
Apr 25 Javascript
node.js如何操作MySQL数据库
Oct 29 Javascript
文本框回车提交与禁止提交示例
Sep 27 #Javascript
JQuery事件e参数的方法preventDefault()取消默认行为
Sep 26 #Javascript
原生js实现改变随意改变div属性style的名称和值的结果
Sep 26 #Javascript
js克隆对象、数组的常用方法介绍
Sep 26 #Javascript
js将当前时间格式转换成时间搓(自写)
Sep 26 #Javascript
使用jquery获取网页中图片高度的两种方法
Sep 26 #Javascript
Extjs实现进度条的两种便捷方式
Sep 26 #Javascript
You might like
手冲咖啡应该是现代精品咖啡店的必备选项吗?
2021/03/03 冲泡冲煮
php通过隐藏表单控件获取到前两个页面的url
2014/09/09 PHP
PHP字符串比较函数strcmp()和strcasecmp()使用总结
2014/11/19 PHP
php+mysql大量用户登录解决方案分析
2014/12/29 PHP
Yii2框架dropDownList下拉菜单用法实例分析
2016/07/18 PHP
[原创]php实现数组按拼音顺序排序的方法
2017/05/03 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
浅谈JavaScript中指针和地址
2015/07/26 Javascript
详解Angularjs中的依赖注入
2016/03/11 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
2017/01/13 Javascript
JavaScript正则替换HTML标签功能示例
2017/03/02 Javascript
JavaScript中关于class的调用方法
2017/11/28 Javascript
微信小程序在地图选择地址并返回经纬度简单示例
2018/12/03 Javascript
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Python制作简单的网页爬虫
2015/11/22 Python
python中os和sys模块的区别与常用方法总结
2017/11/14 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
python3 实现调用串口功能
2019/12/26 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
2020/03/04 Python
python判断all函数输出结果是否为true的方法
2020/12/03 Python
你不知道的5个HTML5新功能
2016/06/28 HTML / CSS
Html5实现单张、多张图片上传功能
2019/04/28 HTML / CSS
英国最大的海报商店:GB Posters
2018/03/20 全球购物
西班牙床垫网上商店:Colchones.es
2018/05/06 全球购物
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
办公室经理岗位职责
2014/01/01 职场文书
优秀社区干部事迹材料
2014/02/03 职场文书
财产保全担保书范文
2014/04/01 职场文书
中国文明网向国旗敬礼寄语大全
2014/09/27 职场文书
学校领导班子四风问题整改意见
2014/10/02 职场文书
2014年终个人总结报告
2015/03/09 职场文书
奖学金主要事迹范文
2015/11/04 职场文书
2016年第104个国际护士节活动总结
2016/04/06 职场文书
2019如何书写演讲稿?
2019/07/01 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书