彻底搞懂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写的分页表格数据为json串
Feb 18 Javascript
javascript实现获取cookie过期时间的变通方法
Aug 14 Javascript
浅谈Node.js中的定时器
Jun 18 Javascript
jquery.serialize() 函数语法及简单实例
Jul 08 Javascript
jQuery表单对象属性过滤选择器实例详解
Sep 13 Javascript
Angularjs中使用轮播图指令swiper
May 30 Javascript
webpack打包单页面如何引用的js
Jun 07 Javascript
webpack3之loader全解析
Oct 26 Javascript
微信小程序如何获取用户手机号
Jan 26 Javascript
Webpack 4.x搭建react开发环境的方法步骤
Aug 15 Javascript
Vue+Django项目部署详解
May 30 Javascript
JavaScript中条件语句的优化技巧总结
Dec 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
Session的工作方式
2006/10/09 PHP
基于PHP编程注意事项的小结
2013/04/27 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
accesskey 提交
2006/06/26 Javascript
javascript 浏览器检测代码精简版
2010/03/04 Javascript
DOM基础教程之使用DOM
2015/01/19 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
全面理解闭包机制
2016/07/11 Javascript
AngularJS模块详解及示例代码
2016/08/17 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
JavaScript截屏功能的实现代码
2017/07/28 Javascript
解决html-jquery/js引用外部图片时遇到看不了或出现403的问题
2017/09/22 jQuery
Element-ui之ElScrollBar组件滚动条的使用方法
2018/09/14 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
2018/10/10 jQuery
速记Python布尔值
2017/11/09 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
详解Python实现进度条的4种方式
2020/01/15 Python
使用Keras构造简单的CNN网络实例
2020/06/29 Python
python实现经典排序算法的示例代码
2021/02/07 Python
CSS3实现红包抖动效果
2020/12/23 HTML / CSS
VSCode 自定义html5模板的实现
2019/12/05 HTML / CSS
Desigual英国官网:在线购买原创服装
2018/03/09 全球购物
Holland & Barrett爱尔兰:英国领先的健康零售商
2019/03/31 全球购物
Prototype如何实现页面局部定时刷新
2013/08/06 面试题
硕士研究生求职自荐信范文
2014/03/11 职场文书
运输服务质量承诺书
2014/03/27 职场文书
《爱如茉莉》教后反思
2014/04/12 职场文书
社会实践评语
2014/04/28 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
2014年环保工作总结
2014/11/26 职场文书
财务经理岗位职责
2015/01/31 职场文书
大二学年个人总结
2015/03/03 职场文书
在职证明书模板
2015/06/15 职场文书
工作感言一句话
2015/08/01 职场文书
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python