彻底搞懂JavaScript中的apply和call方法(必看)


Posted in Javascript onSeptember 18, 2017

call和apply都是为了改变某个函数运行的context上下文而存在的,即为了改变函数体内部this的指向。因为JavaScript的函数存在定义上下文和运行时上下文以及上下文是可以改变的概念。

回到目录定义

fun.apply(thisArg, [argsArray])
fun.call(thisArg, arg1,arg2, ...)

其中thisArg可以为null或undefined,此时表示全局对象,更详细见MDN:apply()、call()

二者的作用完全一样,只是接受参数的方式不太一样。例如,有一个函数定义如下:

var func1 = function(arg1, arg2){};

可以通过func1.call(this, arg1, arg2);或者func1.apply(this, [arg1, arg2])来调用。其中this是你想指定的上下文,它可以是任意一个JavaScript对象(JavaScript一切皆对象),call需要把参数传递进去,而apply则把参数放在数组里。

因为在JavaScript中,某个函数的参数数量是不固定的,当你的参数明确知道数量时,用call,而不确定的时候用apply,然后把参数push进数组传递进去。当参数数量不确定时,函数内部也可以通过arguments这个数组来遍历所有的参数。

回到目录一个例子

在JavaScript OOP中,我们经常会这样定义:

funciton programmer() {
}

programmer.prototype = {
  hobby: 'programming',
  say.function() {
    alert('I love' + this.hobby);
  }
}

var xiaoMing = new programmer();
xiaoMing.say();

此时如果我们有一个设计妹子对象xiaoHua = {hobby: 'designing'};我们不想对它重新定义say方法,那么我们可以通过call或apply使用xiaoMing的say方法:xiaoMing.say.call(xiaoHua)。

由此可看出,call和apply都是为了动态改变this而出现的,当一个object没有某个方法或属性时,但是其他的对象有,则可以借助call或apply来使用其他对象的方法来操作。

obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);

两者都是把obj(即this)绑定到thisObj,这时候thisObj具备(或继承)了obj的属性和方法

其中比较常见的,通过document.getElementByTagName选择的节点是一种类数组,它不能应用Array下的push,pop等方法。但我们可以通过:

var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));

Array.prototype.slice.call能所有具有length属性的对象转为数组,这样domNodes就可以应用Array下的所有方法了。

以上这篇彻底搞懂JavaScript中的apply和call方法(必看)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript下给元素添加事件的方法与代码
Aug 13 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
Apr 17 Javascript
使用AOP改善javascript代码
May 01 Javascript
JavaScript中String.match()方法的使用详解
Jun 06 Javascript
JQuery中ajax方法访问web服务实例
Jul 18 Javascript
关于input全选反选恶心的异常情况
Jul 24 Javascript
JavaScript实现图片瀑布流和底部刷新
Jan 02 Javascript
js实现本地图片文件拖拽效果
Jul 18 Javascript
webstorm中配置Eslint的两种方式及差异比较详解
Oct 19 Javascript
ng-alain的sf如何自定义部件的流程
Jun 12 Javascript
微信小程序用户盒子、宫格列表的实现
Jul 01 Javascript
Vue 使用typescript如何优雅的调用swagger API
Sep 01 Javascript
angularjs实现猜数字大小功能
May 20 #Javascript
angular指令笔记ng-options的使用方法
Sep 18 #Javascript
jQuery UI 实例讲解 - 日期选择器(Datepicker)
Sep 18 #jQuery
javascript  删除select中的所有option的实例
Sep 17 #Javascript
基于Node.js模板引擎教程-jade速学与实战1
Sep 17 #Javascript
浅谈函数调用的不同方式,以及this的指向
Sep 17 #Javascript
基于Bootstrap框架菜鸟入门教程(推荐)
Sep 17 #Javascript
You might like
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
php自动更新版权信息显示的方法
2015/06/19 PHP
Yii2使用swiftmailer发送邮件的方法
2016/05/03 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
JavaScript—window对象使用示例
2013/12/09 Javascript
js实现跨域的方法实例详解
2015/06/24 Javascript
全面解析Bootstrap表单使用方法(表单控件)
2015/11/24 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
巧用jQuery选择器提高写表单效率的方法
2016/08/19 Javascript
JQuery form表单提交前验证单选框是否选中、删除记录时验证经验总结(整理)
2017/06/09 jQuery
详解vue前后台数据交互vue-resource文档
2017/07/19 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
JavaScript判断数组类型的方法
2019/10/23 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
python基础知识小结之集合
2015/11/25 Python
使用Python对Access读写操作
2017/03/30 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
python 字典操作提取key,value的方法
2019/06/26 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
python创建学生管理系统
2019/11/22 Python
django从后台返回html代码的实例
2020/03/11 Python
matlab 计算灰度图像的一阶矩,二阶矩,三阶矩实例
2020/04/22 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
小学国庆节活动方案
2014/02/11 职场文书
餐饮部总监岗位职责范文
2014/02/13 职场文书
运动会广播稿150字(9篇)
2014/09/20 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书