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 相关文章推荐
CSS常用网站布局实例
Apr 03 Javascript
jquery自定义滚动条插件示例分享
Feb 21 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
Feb 23 Javascript
深入了解JavaScript中的Symbol的使用方法
Jul 28 Javascript
javascript控制图片播放的实现代码
Jul 29 Javascript
jQuery实现平滑滚动的标签分栏切换效果
Aug 28 Javascript
AngularJS国际化详解及示例代码
Aug 18 Javascript
JS遍历对象属性的方法示例
Jan 10 Javascript
利用types增强vscode中js代码提示功能详解
Jul 07 Javascript
PostgreSQL Node.js实现函数计算方法示例
Feb 12 Javascript
可能被忽略的一些JavaScript数组方法细节
Feb 28 Javascript
ElementUI radio组件选中小改造
Aug 12 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
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
2013/05/15 PHP
php获取一定范围内取N个不重复的随机数
2016/05/28 PHP
document.all与WEB标准
2020/05/13 Javascript
一个js写的日历(代码部分网摘)
2009/09/20 Javascript
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
javascript单引号和双引号的区别和处理
2014/05/14 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
JavaScript在网页中画圆的函数arc使用方法
2015/11/13 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
2016/06/12 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
vuejs使用$emit和$on进行组件之间的传值的示例
2017/10/04 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
python魔法方法-自定义序列详解
2016/07/21 Python
详解python3中socket套接字的编码问题解决
2017/07/01 Python
Python Grid使用和布局详解
2018/06/30 Python
python实现网页自动签到功能
2019/01/21 Python
Python实现的企业粉丝抽奖功能示例
2019/07/26 Python
python实现的config文件读写功能示例
2019/09/24 Python
Python多线程及其基本使用方法实例分析
2019/10/29 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
巴西购物网站:Submarino
2020/01/19 全球购物
EJB面试题
2015/07/28 面试题
学生拾金不昧表扬信
2014/01/21 职场文书
工作说明书格式
2014/07/29 职场文书
生日寿星公答谢词
2015/09/29 职场文书
2016教师校本研修心得体会
2016/01/08 职场文书
研究生学习计划书应该怎么写?
2019/09/10 职场文书