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 相关文章推荐
JavaScript对象模型-执行模型
Apr 28 Javascript
原生js实现shift/ctrl/alt按键的获取
Apr 08 Javascript
js动态生成Html元素实现Post操作(createElement)
Sep 14 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
Sep 30 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
Apr 12 Javascript
javaScript如何跳出多重循环break、continue
Sep 01 Javascript
AngularJS表格样式简单设置方法示例
Mar 03 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
Apr 25 jQuery
JS简单实现数组去重的方法分析
Oct 14 Javascript
Vue项目总结之webpack常规打包优化方案
Jun 06 Javascript
vue中datepicker的使用教程实例代码详解
Jul 08 Javascript
原生JavaScript实现贪吃蛇游戏
Nov 04 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
农民和部队如何穿矿
2020/03/04 星际争霸
php数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
2016/12/12 PHP
js css样式操作代码(批量操作)
2009/10/09 Javascript
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
原来Jquery.load的方法可以一直load下去
2011/03/28 Javascript
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
JavaScript中实现Map的示例代码
2015/09/09 Javascript
初步了解javascript面向对象
2015/11/09 Javascript
基于Jquery实现仿百度百科右侧导航代码附源码下载
2015/11/27 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
2016/05/03 Javascript
原生JS实现的放大镜效果实例代码
2016/10/15 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
Bootstrap 模态框(Modal)带参数传值实例
2017/08/20 Javascript
JavaScript创建对象的七种方式全面总结
2017/08/21 Javascript
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
angular2路由之routerLinkActive指令【推荐】
2018/05/30 Javascript
JavaScript中七种流行的开源机器学习框架
2018/10/11 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
2020/04/15 Javascript
解决Antd 里面的select 选择框联动触发的问题
2020/10/24 Javascript
浅析vue中的nextTick
2020/12/28 Vue.js
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
如何利用python查找电脑文件
2018/04/27 Python
python根据文本生成词云图代码实例
2019/11/15 Python
使用pytorch和torchtext进行文本分类的实例
2020/01/08 Python
全面介绍python中很常用的单元测试框架unitest
2020/12/14 Python
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
美国著名手表网站:Timepiece
2017/11/15 全球购物
美国著名的家居用品购物网站:Bed Bath & Beyond
2018/01/05 全球购物
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
在校学生职业规划范文
2014/01/08 职场文书
小学标准化建设汇报材料
2014/08/16 职场文书
庆元旦演讲稿
2014/09/15 职场文书
Python实现视频自动打码的示例代码
2022/04/08 Python
MySQL 条件查询的常用操作
2022/04/28 MySQL
python如何查找列表中元素的位置
2022/05/30 Python