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 相关文章推荐
学习YUI.Ext 第二天
Mar 10 Javascript
几款极品的javascript压缩混淆工具
May 16 Javascript
轻量级 JS ToolTip提示效果
Jul 20 Javascript
js弹出模式对话框,并接收回传值的方法
Mar 12 Javascript
原生JavaScript实现Ajax的方法
Apr 07 Javascript
如何使用headjs来管理和异步加载js
Nov 29 Javascript
Centos6.8下Node.js安装教程
May 12 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
Aug 23 jQuery
p5.js实现简单货车运动动画
Oct 23 Javascript
VUE单页面切换动画代码(全网最好的切换效果)
Oct 31 Javascript
js实现拖拽元素选择和删除
Aug 25 Javascript
关于better-scroll插件的无法滑动bug(2021通过插件解决)
Mar 01 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对数组排序的简单实例
2013/12/25 PHP
dedecms中使用php语句指南
2014/11/13 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
PHP实现生成带背景的图形验证码功能
2016/10/03 PHP
Avengerls vs Newbee BO3 第二场2.18
2021/03/10 DOTA
javascript 函数参数限制说明
2010/11/19 Javascript
jQuery实现id模糊查询的小例子
2013/03/19 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
JavaScript实现twitter puddles算法实例
2014/12/06 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
2015/08/06 Javascript
javascript中判断json的方法总结
2015/08/27 Javascript
Knockoutjs 学习系列(一)ko初体验
2016/06/07 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
JavaScript根据json生成html表格的示例代码
2018/10/24 Javascript
了解重排与重绘
2019/05/29 Javascript
jQuery实现文本显示一段时间后隐藏的方法分析
2019/06/20 jQuery
JS检索下拉列表框中被选项目的索引号(selectedIndex)
2019/12/17 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
python正则表达式re模块详解
2014/06/25 Python
Python中为什么要用self探讨
2015/04/14 Python
用Python中的字典来处理索引统计的方法
2015/05/05 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
Python实现加载及解析properties配置文件的方法
2018/03/29 Python
在python Numpy中求向量和矩阵的范数实例
2019/08/26 Python
python sqlite的Row对象操作示例
2019/09/11 Python
python pyecharts 实现一个文件绘制多张图
2020/05/13 Python
HomeAway的巴西品牌:Alugue Temporada
2018/04/10 全球购物
结构和类有什么异同
2012/07/16 面试题
网上常见的一份Linux面试题(多项选择部分)
2015/02/07 面试题
人力资源经理自我评价
2014/01/04 职场文书
如何写好升职自荐信
2014/01/06 职场文书
学校个人对照检查材料
2014/08/26 职场文书
Mysql中where与on的区别及何时使用详析
2021/08/04 MySQL
mysql中DCL常用的用户和权限控制
2022/03/31 MySQL