彻底搞懂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面试题与Javascript词法作用域说明
Nov 09 Javascript
JavaScript中:表达式和语句的区别[译]
Sep 17 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
May 04 Javascript
jQuery中change事件用法实例
Dec 26 Javascript
jQuery调用ajax请求的常见方法汇总
Mar 24 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
Oct 17 Javascript
JS实现按钮颜色切换效果
Sep 05 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
Oct 23 Javascript
微信小程序与公众号卡券/会员打通的问题
Jul 25 Javascript
vue 自动化路由实现代码
Sep 03 Javascript
JS实现滑动插件
Jan 15 Javascript
vue中template的三种写法示例
Oct 21 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中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
2013/06/28 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
Yii框架日志操作图文与实例详解
2019/09/09 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
2020/04/06 PHP
javascript 类方法定义还是有点区别
2009/04/15 Javascript
event.X和event.clientX的区别分析
2011/10/06 Javascript
javascript中全局对象的parseInt()方法使用介绍
2013/12/19 Javascript
js的toUpperCase方法用法实例
2015/01/27 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
基于javascript实现右下角浮动广告效果
2016/01/08 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
vue-router的钩子函数用法实例分析
2019/10/26 Javascript
vue 项目软键盘回车触发搜索事件
2020/09/09 Javascript
在antd4.0中Form使用initialValue操作
2020/11/02 Javascript
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
python实现应用程序在右键菜单中添加打开方式功能
2017/01/09 Python
python3使用pyqt5制作一个超简单浏览器的实例
2017/10/19 Python
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
2019/07/09 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
python实现批处理文件
2020/07/28 Python
python+appium+yaml移动端自动化测试框架实现详解
2020/11/24 Python
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
Html5实现移动端、PC端 刮刮卡效果
2016/06/30 HTML / CSS
跑鞋、网球鞋、网球拍、服装及装备:Holabird Sports
2016/09/19 全球购物
柏林通行证:Berlin Pass
2018/04/11 全球购物
华为消费者德国官方网站:HUAWEI德国
2020/11/03 全球购物
大学自我鉴定
2013/12/20 职场文书
详解Python requests模块
2021/06/21 Python
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby
MySQL索引失效场景及解决方案
2022/07/23 MySQL