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 相关文章推荐
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
Feb 03 Javascript
JavaScript中的noscript元素属性位置及作用介绍
Apr 11 Javascript
公共js在页面底部加载的注意事项介绍
Jul 18 Javascript
Jquery实现的tab效果可以指定默认显示第几页
Oct 16 Javascript
Juery解决tablesorter中文排序和字符范围的方法
May 06 Javascript
详解JavaScript中的Unescape()和String() 函数
Nov 09 Javascript
JS实现alert中显示换行的方法
Dec 17 Javascript
slideToggle+slideup实现手机端折叠菜单效果
May 25 Javascript
javascript  删除select中的所有option的实例
Sep 17 Javascript
基于JavaScript实现幸运抽奖页面
Jul 05 Javascript
vue实现双向绑定和依赖收集遇到的坑
Nov 29 Javascript
JS实现简单的九宫格抽奖
Jun 28 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
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
2016/10/13 PHP
JavaScript 设计模式学习 Factory
2009/07/29 Javascript
jQuery中的.bind()、.live()和.delegate()之间区别分析
2011/06/08 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
2013/04/15 Javascript
在javascript中创建对象的各种模式解析
2016/05/16 Javascript
AngularJS控制器controller给模型数据赋初始值的方法
2017/01/04 Javascript
WebView启动支付宝客户端支付失败的问题小结
2017/01/11 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
Vue2 配置 Axios api 接口调用文件的方法
2017/11/13 Javascript
React Native自定义控件底部抽屉菜单的示例
2018/02/08 Javascript
微信小程序常用简易小函数总结
2019/02/01 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
2019/04/10 Javascript
彻底揭秘keep-alive原理(小结)
2019/05/05 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
JS实现横向轮播图(中级版)
2020/01/18 Javascript
python算法学习之桶排序算法实例(分块排序)
2013/12/18 Python
python 列表递归求和、计数、求最大元素的实例
2018/11/28 Python
Python3.5面向对象编程图文与实例详解
2019/04/24 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
Python 私有属性和私有方法应用场景分析
2020/06/19 Python
移动Web—CSS为Retina屏幕替换更高质量的图片
2012/12/24 HTML / CSS
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
班主任经验交流会主持词
2014/04/01 职场文书
七夕情人节促销方案
2014/06/07 职场文书
2014年老干部工作总结
2014/11/21 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
投资合作意向书范本
2015/05/08 职场文书
培训学校2015年度工作总结
2015/07/20 职场文书
大学生安全教育主题班会
2015/08/12 职场文书
2016高一新生军训心得体会
2016/01/11 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
如何写一份成功的商业计划书
2019/06/25 职场文书