Javascript call及apply应用场景及实例


Posted in Javascript onAugust 26, 2020

一、作用及应用场景

call和apply是Function的方法,他的第一个参数是this,第二个是Function的参数。call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。因为 JavaScript 的函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念。二者的作用完全一样,只是接受参数的方式不太一样。

call 需要把参数按顺序传递进去,而 apply 则是把参数放在数组里。

例如,有一个函数 func1 定义如下:

var func1 = function(arg1, arg2) {};

就可以通过 func1.call(this, arg1, arg2); 或者 func1.apply(this, [arg1, arg2]); 来调用。其中 this 是你想指定的上下文,他可以任何一个 JavaScript 对象(JavaScript 中一切皆对象)。

JavaScript 中,某个函数的参数数量是不固定的,因此要说适用条件的话,当你的参数是明确知道数量时,用 call,而不确定的时候,用 apply,然后把参数 push 进数组传递进去。当参数数量不确定时,函数内部也可以通过 arguments 这个数组来便利所有的参数。

二、存在call和apply的原因

在javascript OOP中,我们经常会这样定义:

function cat(){
}
cat.prototype={
food:"fish",
say: function(){
alert("I love "+this.food);
}
}
var blackCat = new cat;
blackCat.say();

但是如果我们有一个对象whiteDog = {food:"bone"},我们不想对它重新定义say方法,那么我们可以通过call或apply用blackCat的say方法:blackCat.say.call(whiteDog);

所以,可以看出call和apply是为了动态改变this而出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作。

用的比较多的,通过document.getElementsByTagName选择的dom 节点是一种类似array的array。它不能应用Array下的push,pop等方法。我们可以通过:

var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));

这样domNodes就可以应用Array下的所有方法了。

三、例子

call中的第一个参数用于指定将要调用此函数的对象,例子中changeStyle函数将被box对象调用,this指向了box对象。

function changeStyle(attr, value){
  this.style[attr] = value;
}
var box = document.getElementById('box');
window.changeStyle.call(box, "height", "200px");

Javascript call及apply应用场景及实例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
csdn 博客的css样式 v3
Feb 24 Javascript
Javascript new关键字的玄机 以及其它
Aug 25 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
Jan 24 Javascript
js实现有时间限制消失的图片方法
Feb 27 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
Jun 20 Javascript
相册展示PhotoSwipe.js插件实现
Aug 25 Javascript
关于Function中的bind()示例详解
Dec 02 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
Aug 14 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
Sep 04 Javascript
js实现缓动动画
Nov 25 Javascript
vue项目如何监听localStorage或sessionStorage的变化
Jan 04 Vue.js
详解JavaScript中分解数字的三种方法
Jan 05 Javascript
Javascript类型判断相关例题及解析
Aug 26 #Javascript
Javascript基于OOP实实现探测器功能代码实例
Aug 26 #Javascript
Javascript如何实现扩充基本类型
Aug 26 #Javascript
Javascript var变量删除原理及实现
Aug 26 #Javascript
js实现车辆管理系统
Aug 26 #Javascript
js实现飞机大战小游戏
Aug 26 #Javascript
JS面向对象实现飞机大战
Aug 26 #Javascript
You might like
php数组函数序列之array_key_exists() - 查找数组键名是否存在
2011/10/29 PHP
php模拟post行为代码总结(POST方式不是绝对安全)
2012/02/22 PHP
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
2014/05/04 PHP
浅析PHP文件下载原理
2014/12/25 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
PHP简单实现二维数组的矩阵转置操作示例
2017/11/24 PHP
laravel实现于语言包的完美切换方法
2019/09/29 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
精选的10款用于构建良好易用性网站的jQuery插件
2011/01/23 Javascript
JQuery对checkbox操作 (循环获取)
2011/05/20 Javascript
jquery图片滚动放大代码分享(1)
2015/08/25 Javascript
JS+CSS相对定位实现的下拉菜单
2015/10/06 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
2017/05/17 Javascript
Vue DevTools调试工具的使用
2017/12/05 Javascript
实例学习JavaScript读取和写入cookie
2018/01/29 Javascript
jQuery的Ajax接收java返回数据方法
2018/08/11 jQuery
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
如何从0开始用node写一个自己的命令行程序
2018/12/29 Javascript
JS对象和字符串之间互换操作实例分析
2019/02/02 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
JavaScript十大取整方法实例教程
2020/12/03 Javascript
详解django实现自定义manage命令的扩展
2019/08/13 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
利物浦足球俱乐部官方网上商店:Liverpool FC Official Store
2018/01/13 全球购物
vue+django实现下载文件的示例
2021/03/24 Vue.js
大专生自我鉴定范文
2013/10/01 职场文书
大学毕业感言50字
2014/02/07 职场文书
乡镇三严三实学习心得体会
2014/10/13 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
部门主管竞聘书
2015/09/15 职场文书
小学数学教师研修日志
2015/11/13 职场文书