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 相关文章推荐
Some tips of wmi scripting in jscript (1)
Apr 03 Javascript
JavaScript控制Session操作方法
Jan 17 Javascript
js运动框架_包括图片的淡入淡出效果
May 11 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
Aug 06 Javascript
全面了解addEventListener和on的区别
Jul 14 Javascript
bootstrap table 数据表格行内修改的实现代码
Feb 13 Javascript
JavaScript禁止微信浏览器下拉回弹效果
May 16 Javascript
vue两个组件间值的传递或修改方式
Jul 04 Javascript
bootstrap table表格插件之服务器端分页实例代码
Sep 12 Javascript
webpack之引入图片的实现及问题
Oct 08 Javascript
关于vue利用postcss-pxtorem进行移动端适配的问题
Nov 20 Javascript
详解Vue的options
May 15 Vue.js
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设计模式 Observer(观察者模式)
2011/06/26 PHP
php绘图中显示不出图片的原因及解决
2014/03/05 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
细品javascript 寻址,闭包,对象模型和相关问题
2009/04/27 Javascript
JavaScript访问样式表代码
2010/10/15 Javascript
滚动图片效果 jquery实现回旋滚动效果
2013/01/08 Javascript
jquery获取div宽度的实现思路与代码
2013/01/13 Javascript
jquery简单实现图片切换效果的方法
2015/05/12 Javascript
jQuery 插件封装的方法
2016/11/16 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
angular学习之ngRoute路由机制
2017/04/12 Javascript
浅谈vue中.vue文件解析流程
2018/04/24 Javascript
原生JS实现列表内容自动向上滚动效果
2019/05/22 Javascript
解决VUEX的mapState/...mapState等取值问题
2020/07/24 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
python二叉树遍历的实现方法
2013/11/21 Python
跟老齐学Python之Python安装
2014/09/12 Python
python ddt实现数据驱动
2018/03/14 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
2019/08/09 Python
使用pycharm和pylint检查python代码规范操作
2020/06/09 Python
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
BASIC HOUSE官方旗舰店:韩国著名的服装品牌
2018/09/27 全球购物
Coccinelle官网:意大利的著名皮具品牌
2019/05/15 全球购物
巴西化妆品商店:Lojas Rede
2019/07/26 全球购物
杭州SQL浙江浙大网新恩普软件有限公司
2013/07/27 面试题
毕业生的自我评价分享
2013/12/18 职场文书
2014年工会工作总结
2014/11/12 职场文书
2015毕业寄语大全
2015/02/26 职场文书
食品卫生管理制度
2015/08/06 职场文书
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书
成本低的5个创业项目:投资小、赚钱快
2019/08/20 职场文书
Qt数据库应用之实现图片转pdf
2022/06/01 Java/Android