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 相关文章推荐
论坛特效代码收集(落伍转发-不错)
Dec 02 Javascript
js获取当前页面路径示例讲解
Jan 08 Javascript
json格式数据的添加,删除及排序方法
Jan 21 Javascript
JS组件Bootstrap实现弹出框效果代码
Apr 26 Javascript
基于JS代码实现导航条弹出式悬浮菜单
Jun 17 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
Dec 27 Javascript
Angularjs 实现动态添加控件功能
May 25 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
Aug 03 Javascript
JS实现身份证输入框的输入效果
Aug 21 Javascript
JS实现深度优先搜索求解两点间最短路径
Jan 17 Javascript
javascript防抖函数debounce详解
Jun 11 Javascript
微信小程序表单验证WxValidate的使用
Nov 27 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&MYSQL留言板源码
2020/07/19 PHP
PHP的分页功能
2007/03/21 PHP
用PHP解决的一个栈的面试题
2014/07/02 PHP
php数组键值用法实例分析
2015/02/27 PHP
Yii中的relations数据关联查询及统计功能用法详解
2016/07/14 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
js过滤HTML标签以及空格的思路及代码
2013/05/24 Javascript
smartcrop.js智能图片裁剪库
2015/10/14 Javascript
vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动)
2017/10/16 Javascript
浅谈Vue SSR 的 Cookies 问题
2017/11/20 Javascript
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
2019/09/11 Javascript
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
python 多进程通信模块的简单实现
2014/02/20 Python
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
python实现的简单FTP上传下载文件实例
2015/06/30 Python
Python中的命令行参数解析工具之docopt详解
2017/03/27 Python
编写多线程Python服务器 最适合基础
2018/09/14 Python
在python中将字符串转为json对象并取值的方法
2018/12/31 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
小天鹅官方商城:LittleSwan
2017/06/16 全球购物
英国音乐设备和乐器商店:Gear4music
2017/10/16 全球购物
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
毕业生就业协议书
2014/04/11 职场文书
春节联欢会策划方案
2014/05/16 职场文书
经济贸易系求职信
2014/08/04 职场文书
小区门卫岗位职责范本
2014/08/24 职场文书
实验心得体会
2014/09/05 职场文书
正规借条模板
2015/05/26 职场文书
爱国主题班会教案
2015/08/14 职场文书
浅谈MySql update会锁定哪些范围的数据
2022/06/25 MySQL