彻底搞懂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 相关文章推荐
doctype后如何获得body.clientHeight的方法
Jul 11 Javascript
javascript之querySelector和querySelectorAll使用说明
Oct 09 Javascript
JS实现点击下载的小例子
Jul 10 Javascript
JS正则表达式获取分组内容的方法详解
Nov 15 Javascript
jQuery实现Div拖动+键盘控制综合效果的方法
Mar 10 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
Aug 04 Javascript
jQuery validate 验证radio实例
Mar 01 Javascript
十个免费的web前端开发工具详细整理
Sep 18 Javascript
jQuery实现简单的回到顶部totop功能示例
Oct 16 jQuery
element-ui upload组件多文件上传的示例代码
Oct 17 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
Apr 22 Javascript
JavaScript生成随机验证码代码实例
Sep 28 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 has encountered a Stack overflow问题解决方法
2014/11/03 PHP
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
2014/11/20 PHP
PHP中字符安全过滤函数使用小结
2015/02/25 PHP
PHP xpath提取网页数据内容代码解析
2020/07/16 PHP
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
JS date对象的减法处理实现代码
2010/12/28 Javascript
jQuery EasyUI API 中文文档 - NumberBox数字框
2011/10/13 Javascript
jQuery侧边栏随窗口滚动实现方法
2013/03/04 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
JavaScript显示当然日期和时间即年月日星期和时间
2013/10/29 Javascript
iframe的onreadystatechange事件在firefox下的使用
2014/04/16 Javascript
jQuery实现tab标签自动切换的方法
2015/02/28 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
如何防止JavaScript自动插入分号
2015/11/05 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
基于angular-utils-ui-breadcrumbs使用心得(分享)
2017/11/03 Javascript
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
2020/01/18 Javascript
[39:07]LGD vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
Python 26进制计算实现方法
2015/05/28 Python
python 输出上个月的月末日期实例
2018/04/11 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
基于Python中的yield表达式介绍
2019/11/19 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
2020/03/10 Python
经典的毕业生自荐信范文
2014/04/14 职场文书
小学运动会口号
2014/06/07 职场文书
博士生导师推荐信
2014/07/08 职场文书
走进敬老院活动总结
2014/07/10 职场文书
雷锋式好少年事迹材料
2014/08/17 职场文书
2015民办小学年度工作总结
2015/05/26 职场文书
2015元旦感言
2015/12/09 职场文书
ORACLE数据库应用开发的三十个注意事项
2021/06/07 Oracle
springcloud之Feign超时问题的解决
2021/06/24 Java/Android