彻底搞懂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 相关文章推荐
jQuery 表单验证扩展(四)
Oct 20 Javascript
IE6、IE7中获取Button元素的值的bug说明
Aug 28 Javascript
Javascript面向对象编程(二) 构造函数的继承
Aug 28 Javascript
jquery Mobile入门—多页面切换示例学习
Jan 08 Javascript
巧用jquery解决下拉菜单被Div遮挡的相关问题
Feb 13 Javascript
详解JavaScript ES6中的模板字符串
Jul 28 Javascript
JS随机排序数组实现方法分析
Oct 11 Javascript
JS实现留言板功能[楼层效果展示]
Dec 27 Javascript
浅谈Postman解决token传参的问题
Mar 31 Javascript
vueJs实现DOM加载完之后自动下拉到底部的实例代码
Aug 31 Javascript
angularjs手动识别字符串中的换行符方法
Oct 02 Javascript
详解阿里Node.js技术文档之process模块学习指南
Jan 04 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的远程图片抓取函数分享
2013/09/25 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
Laravel框架Auth用户认证操作实例分析
2019/09/29 PHP
js脚本学习 比较实用的基础
2006/09/07 Javascript
js 操作符实例代码
2009/10/24 Javascript
javascript Demo模态窗口
2009/12/06 Javascript
JavaScript与Image加载事件(onload)、加载状态(complete)
2011/02/14 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
2014/01/13 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
浅谈javascript基础之客户端事件驱动
2016/06/10 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
在web中js实现类似excel的表格控件
2016/09/01 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
详解nodejs 文本操作模块-fs模块(三)
2016/12/22 NodeJs
nodejs初始化init的示例代码
2018/10/10 NodeJs
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
javascript防抖函数debounce详解
2019/06/11 Javascript
在Vue项目中使用Typescript的实现
2019/12/19 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
JS实现关闭小广告特效
2021/01/29 Javascript
[01:38]【DOTA2亚洲邀请赛】Sumail——梦开始的地方
2017/03/03 DOTA
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
Python实现LRU算法的2种方法
2015/06/24 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
对命令行模式与python交互模式介绍
2018/05/12 Python
解决python线程卡死的问题
2019/02/18 Python
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
送给他或她的礼物:FUN.com
2018/08/17 全球购物
eDreams意大利:南欧领先的在线旅行社
2018/11/23 全球购物
意大利单身交友网站:Meetic
2020/07/12 全球购物
Unix里面如何在后台运行程序
2016/10/14 面试题
书法培训心得体会
2014/01/05 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
党员教师个人对照检查材料范文
2014/09/25 职场文书
工作失误检讨书
2015/01/26 职场文书
心得体会格式及范文
2016/01/25 职场文书