彻底搞懂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验证jsp页面属性是否为空(实例代码)
Nov 08 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
Nov 24 Javascript
jQuery实现div拖拽效果实例分析
Feb 20 Javascript
JS获取鼠标选中的文字
Aug 10 Javascript
Bootstrap模态框使用详解
Feb 15 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
Apr 05 Javascript
微信小程序 生命周期函数详解
May 24 Javascript
angularjs之$timeout指令详解
Jun 13 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
Aug 04 Javascript
Js利用console计算代码运行时间的方法示例
Sep 24 Javascript
vue封装第三方插件并发布到npm的方法
Sep 25 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
Feb 16 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 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
PHP设计模式之迭代器模式的深入解析
2013/06/13 PHP
js实现DIV的一些简单控制
2007/06/04 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
JavaScript通过prototype给对象定义属性用法实例
2015/03/23 Javascript
javascript for-in有序遍历json数据并探讨各个浏览器差异
2015/11/30 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
网络传输协议(http协议)
2016/11/18 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
JavaScript数组排序reverse()和sort()方法详解
2017/12/24 Javascript
Vue2.0 http请求以及loading展示实例
2018/03/06 Javascript
vue改变对象或数组时的刷新机制的方法总结
2019/04/24 Javascript
vue项目打包后怎样优雅的解决跨域
2019/05/26 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
2019/09/21 Javascript
15 分钟掌握vue-next响应式原理
2019/10/13 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
Python读取mp3中ID3信息的方法
2015/03/05 Python
Python基于pillow判断图片完整性的方法
2016/09/18 Python
numpy.transpose对三维数组的转置方法
2018/04/17 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
浅谈Python中的bs4基础
2018/10/21 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
2019/07/03 Python
Python列表的切片实例讲解
2019/08/20 Python
Python文件操作函数用法实例详解
2019/12/24 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
使用html5 canvas创建太空游戏的示例
2014/05/08 HTML / CSS
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
毕业生求职简历的自我评价
2013/10/07 职场文书
教师一岗双责责任书
2014/04/16 职场文书
2016年优秀少先队员事迹材料
2016/02/26 职场文书
浅谈怎么给Python添加类型标注
2021/06/08 Python