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 相关文章推荐
js 实现无缝滚动 兼容IE和FF
Jul 15 Javascript
JavaScript中的私有/静态属性介绍
Jul 26 Javascript
jQuery实现3D文字特效的方法
Mar 10 Javascript
AngularJS手动表单验证
Feb 01 Javascript
原生JavaScript实现Ajax的方法
Apr 07 Javascript
jquery制做精致的倒计时特效
Jun 13 Javascript
vue路由嵌套的SPA实现步骤
Nov 06 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
Feb 10 Javascript
Javasript设计模式之链式调用详解
Apr 26 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
Jan 21 Javascript
JS实现基本的网页计算器功能示例
Jan 16 Javascript
JS实现放大镜效果
Sep 21 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编程最快明白》第五讲:php目录、文件操作
2010/11/01 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
laravel 多图上传及图片的存储例子
2019/10/14 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
2019/10/18 PHP
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
2007/10/23 Javascript
很可爱的输入框
2008/08/03 Javascript
JSONP 跨域共享信息
2012/08/16 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
jquery ui对话框实例代码
2013/05/10 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
无需 Flash 使用 jQuery 复制文字到剪贴板
2016/04/26 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
浅析Vue.js 中的条件渲染指令
2018/11/19 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
js实现贪吃蛇小游戏
2019/10/29 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
微信小程序实现底部弹出框
2020/11/18 Javascript
Python中max函数用法实例分析
2015/07/17 Python
解析Python编程中的包结构
2015/10/25 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
2019/10/23 Python
python多线程高级锁condition简单用法示例
2019/11/07 Python
Python flask路由间传递变量实例详解
2020/06/03 Python
咖啡为什么会有酸味?你喝到的咖啡為什麼是酸的?
2021/03/17 冲泡冲煮
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
Shopbop中文官网:美国亚马逊旗下时尚购物网站
2020/12/15 全球购物
国际贸易专业个人鉴定
2014/02/22 职场文书
《美丽的公鸡》教学反思
2014/02/25 职场文书
美容院店长岗位职责
2014/04/08 职场文书
厨房领班竞聘演讲稿
2014/04/23 职场文书
品牌服务方案
2014/06/03 职场文书
小时代观后感
2015/06/10 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书
sql查询语句之平均分、最高最低分及排序语句
2022/05/30 MySQL