彻底搞懂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 相关文章推荐
js判断上传文件的类型和大小示例代码
Oct 18 Javascript
jquery常用方法及使用示例汇总
Nov 08 Javascript
JavaScript 常见安全漏洞和自动化检测技术
Aug 21 Javascript
js如何改变文章的字体大小
Jan 08 Javascript
AngularJS 过滤器的简单实例
Jul 27 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
Dec 08 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
Dec 29 Javascript
vue动态改变背景图片demo分享
Sep 13 Javascript
jQuery实现的点击图片居中放大缩小功能示例
Jan 16 jQuery
javascript 设计模式之组合模式原理与应用详解
Apr 08 Javascript
tracking.js实现前端人脸识别功能
Apr 16 Javascript
绘制微信小程序验证码功能的实例代码
Jan 05 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
最小化数据传输――在客户端存储数据
2006/10/09 PHP
如何使用PHP批量去除文件UTF8 BOM信息
2013/08/05 PHP
微信公众平台消息接口校验与消息接口响应实例
2014/12/23 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
PHP读书笔记整理_结构语句详解
2016/07/01 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
Laravel如何创建服务器提供者实例代码
2019/04/15 PHP
javascript 正则表达式相关应介绍
2012/11/27 Javascript
jquery cookie的用法总结
2013/11/18 Javascript
使用javascript控制cookie显示和隐藏背景图
2014/02/12 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
分享jQuery网页元素拖拽插件
2020/12/01 Javascript
如何基于javascript实现贪吃蛇游戏
2020/02/09 Javascript
python实现图片筛选程序
2018/10/24 Python
在Python中实现替换字符串中的子串的示例
2018/10/31 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
Python读取stdin方法实例
2019/05/24 Python
python解压TAR文件至指定文件夹的实例
2019/06/10 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
Python自动化xpath实现自动抢票抢货
2020/09/19 Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
2020/10/30 Python
五种Python转义表示法
2020/11/27 Python
python sleep和wait对比总结
2021/02/03 Python
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
2014/03/31 HTML / CSS
说出一些常用的类,包,接口
2014/09/22 面试题
大专学生推荐信范文
2013/11/19 职场文书
揠苗助长教学反思
2014/02/04 职场文书
企业业务员岗位职责
2014/03/14 职场文书
员工三分钟演讲稿
2014/08/19 职场文书
群众路线个人整改措施
2014/10/24 职场文书
城管年度个人总结
2015/02/28 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
2015年数学教研工作总结
2015/07/22 职场文书
2016抗战胜利71周年红领巾广播稿
2015/12/18 职场文书
中国梦党课学习心得体会
2016/01/05 职场文书