彻底搞懂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面向对象编程
Mar 18 Javascript
js去除重复字符串两种实现方法
Jan 09 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
Oct 16 Javascript
JavaScript自定义数组排序方法
Feb 12 Javascript
jquery插件autocomplete用法示例
Jul 01 Javascript
jQuery实现的选择商品飞入文本框动画效果完整实例
Aug 10 Javascript
js弹出窗口简单实现代码
Mar 22 Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
Jan 07 Javascript
vue动态绘制四分之三圆环图效果
Sep 03 Javascript
js实现ajax的用户简单登入功能
Jun 18 Javascript
vue 将多个过滤器封装到一个文件中的代码详解
Sep 05 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
Dec 01 Vue.js
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开源建站平台小结
2010/04/22 PHP
php 批量替换html标签的实例代码
2013/11/26 PHP
php中magic_quotes_gpc对unserialize的影响分析
2014/12/16 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
2016/03/03 PHP
js打造数组转json函数
2015/01/14 Javascript
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
JS Array.slice 截取数组的实现方法
2016/01/02 Javascript
javascript 判断页面访问方式电脑或者移动端
2016/09/19 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
js 数据存储和DOM编程
2017/02/09 Javascript
babel基本使用详解
2017/02/17 Javascript
浅析vue component 组件使用
2017/03/06 Javascript
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
jQuery实现手势解锁密码特效
2017/08/14 jQuery
Vue CLI3中使用compass normalize的方法
2019/05/30 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
node.js 微信开发之定时获取access_token
2020/02/07 Javascript
在vue中封装方法以及多处引用该方法详解
2020/08/14 Javascript
vue图片裁剪插件vue-cropper使用方法详解
2020/12/16 Vue.js
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
[47:35]VP vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
Python smallseg分词用法实例分析
2015/05/28 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
python实现换位加密算法的示例
2018/10/14 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
django数据模型(Model)的字段类型解析
2019/12/25 Python
浅谈keras中的keras.utils.to_categorical用法
2020/07/02 Python
Pat McGrath Labs官网:世界上最有影响力的化妆师推出的彩妆品牌
2018/01/07 全球购物
2014年居委会工作总结
2014/12/09 职场文书
男方婚前保证书
2015/02/28 职场文书
魂断蓝桥观后感
2015/06/10 职场文书
送给自己的励志语句:要安静的优秀,悄无声息的坚强
2019/11/26 职场文书
python小程序之飘落的银杏
2021/04/17 Python
Mysql数据库事务的脏读幻读及不可重复读详解
2022/05/30 MySQL