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获取IUSR_机器名和IWAM_机器名帐号的密码
Dec 06 Javascript
一些主流JS框架中DOMReady事件的实现小结
Feb 12 Javascript
调试Javascript代码(浏览器F12及VS中debugger关键字)
Jan 25 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
Jun 09 Javascript
深入解析JavaScript中的数字对象与字符串对象
Oct 21 Javascript
JS使用post提交的两种方式
Dec 03 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
May 15 Javascript
Angular.Js的自动化测试详解
Dec 09 Javascript
AngularJS动态菜单操作指令
Apr 25 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
Dec 12 Javascript
JavaScript常用内置对象用法分析
Jul 09 Javascript
vue.js实现简单购物车功能
May 30 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
DC游戏Steam周三特惠 《蝙蝠侠》阿卡姆系列平史低
2020/04/09 欧美动漫
用PHP连mysql和oracle数据库性能比较
2006/10/09 PHP
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
php 文章采集正则代码
2009/12/28 PHP
PHP用SAX解析XML的实现代码与问题分析
2011/08/22 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
PHP基于PDO扩展操作mysql数据库示例
2018/12/24 PHP
基于jquery的防止大图片撑破页面的实现代码(立即缩放)
2011/10/24 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
JavaScript参数个数可变的函数举例说明
2014/10/10 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
2014/10/14 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
2014/10/21 Javascript
JQuery validate插件验证用户注册信息
2016/05/11 Javascript
前端js实现文件的断点续传 后端PHP文件接收
2016/10/14 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
日期时间范围选择插件:daterangepicker使用总结(必看篇)
2017/09/14 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
[01:02:46]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[00:56]跨越时空加入战场 全新祈求者身心“失落奇艺侍祭”展示
2019/07/20 DOTA
python实现的一个p2p文件传输实例
2014/06/04 Python
Python中if __name__ == '__main__'作用解析
2015/06/29 Python
django用户登录验证的完整示例代码
2019/07/21 Python
基于 HTML5 WebGL 实现的垃圾分类系统
2019/10/08 HTML / CSS
使用phonegap进行本地存储的实现方法
2017/03/31 HTML / CSS
猫咪家具:CatsPlay
2018/11/03 全球购物
Hurley官方网站:扎根于海滩生活方式的全球青年文化品牌
2020/05/18 全球购物
学校门卫管理制度
2014/01/30 职场文书
大学学雷锋活动总结
2014/06/26 职场文书
2014年应急管理工作总结
2014/11/26 职场文书
小学班主任自我评价
2015/03/11 职场文书
运动会通讯稿100字
2015/07/20 职场文书