彻底搞懂JavaScript中的apply和call方法(必看)


Posted in Javascript onSeptember 18, 2017

call和apply都是为了改变某个函数运行的context上下文而存在的,即为了改变函数体内部this的指向。因为JavaScript的函数存在定义上下文和运行时上下文以及上下文是可以改变的概念。

回到目录定义

fun.apply(thisArg, [argsArray])
fun.call(thisArg, arg1,arg2, ...)

其中thisArg可以为null或undefined,此时表示全局对象,更详细见MDN:apply()、call()

二者的作用完全一样,只是接受参数的方式不太一样。例如,有一个函数定义如下:

var func1 = function(arg1, arg2){};

可以通过func1.call(this, arg1, arg2);或者func1.apply(this, [arg1, arg2])来调用。其中this是你想指定的上下文,它可以是任意一个JavaScript对象(JavaScript一切皆对象),call需要把参数传递进去,而apply则把参数放在数组里。

因为在JavaScript中,某个函数的参数数量是不固定的,当你的参数明确知道数量时,用call,而不确定的时候用apply,然后把参数push进数组传递进去。当参数数量不确定时,函数内部也可以通过arguments这个数组来遍历所有的参数。

回到目录一个例子

在JavaScript OOP中,我们经常会这样定义:

funciton programmer() {
}

programmer.prototype = {
  hobby: 'programming',
  say.function() {
    alert('I love' + this.hobby);
  }
}

var xiaoMing = new programmer();
xiaoMing.say();

此时如果我们有一个设计妹子对象xiaoHua = {hobby: 'designing'};我们不想对它重新定义say方法,那么我们可以通过call或apply使用xiaoMing的say方法:xiaoMing.say.call(xiaoHua)。

由此可看出,call和apply都是为了动态改变this而出现的,当一个object没有某个方法或属性时,但是其他的对象有,则可以借助call或apply来使用其他对象的方法来操作。

obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);

两者都是把obj(即this)绑定到thisObj,这时候thisObj具备(或继承)了obj的属性和方法

其中比较常见的,通过document.getElementByTagName选择的节点是一种类数组,它不能应用Array下的push,pop等方法。但我们可以通过:

var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));

Array.prototype.slice.call能所有具有length属性的对象转为数组,这样domNodes就可以应用Array下的所有方法了。

以上这篇彻底搞懂JavaScript中的apply和call方法(必看)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript高级程序设计
Dec 29 Javascript
修改js Calendar日历控件 兼容IE9/谷歌/火狐
Jan 04 Javascript
jquery实现简单易懂的图片展示小例子
Nov 21 Javascript
js闭包实现按秒计数
Apr 23 Javascript
仿iframe效果Aajx文件上传实例
Nov 18 Javascript
火狐和ie下获取javascript 获取event的方法(推荐)
Nov 26 Javascript
JavaScript实现三级联动菜单效果
Aug 16 Javascript
vue图片上传本地预览组件使用详解
Feb 20 Javascript
JavaScript中常用的简洁高级技巧总结
Mar 10 Javascript
详解VUE前端按钮权限控制
Apr 26 Javascript
angular8和ngrx8结合使用的步骤介绍
Dec 01 Javascript
js 实现验证码输入框示例详解
Sep 23 Javascript
angularjs实现猜数字大小功能
May 20 #Javascript
angular指令笔记ng-options的使用方法
Sep 18 #Javascript
jQuery UI 实例讲解 - 日期选择器(Datepicker)
Sep 18 #jQuery
javascript  删除select中的所有option的实例
Sep 17 #Javascript
基于Node.js模板引擎教程-jade速学与实战1
Sep 17 #Javascript
浅谈函数调用的不同方式,以及this的指向
Sep 17 #Javascript
基于Bootstrap框架菜鸟入门教程(推荐)
Sep 17 #Javascript
You might like
ThinkPHP php 框架学习笔记
2009/10/30 PHP
php获取后台Job管理的实现代码
2011/06/10 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
使用PHP curl模拟浏览器抓取网站信息
2013/10/28 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
Mootools 1.2教程 函数
2009/09/15 Javascript
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
javascript每日必学之多态
2016/02/23 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
2016/11/25 Javascript
canvas学习之API整理笔记(二)
2016/12/29 Javascript
JS实现换肤功能的方法实例详解
2019/01/30 Javascript
利用angular自动编译andriod APK的绕坑经历分享
2019/03/08 Javascript
JavaScript实现的滚动公告特效【基于jQuery】
2019/07/10 jQuery
Angular6项目打包优化的实现方法
2019/12/15 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
[02:49]DAC2018决赛日TOP5 LGD开启黑暗之门绝杀VP
2018/04/08 DOTA
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
基于Python实现的微信好友数据分析
2018/02/26 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
2019/01/30 Python
python获取linux系统信息的三种方法
2020/10/14 Python
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
2013/01/30 HTML / CSS
设计师大码女装:11 Honoré
2020/05/03 全球购物
西式婚礼主持词
2014/03/13 职场文书
办公设备采购方案
2014/03/16 职场文书
外语系毕业生求职自荐信
2014/04/12 职场文书
舞蹈专业求职信
2014/06/13 职场文书
品质口号大全
2014/06/17 职场文书
国贸专业求职信
2014/06/28 职场文书
党的群众路线教育实践活动个人整改落实情况汇报
2014/10/28 职场文书
六一儿童节开幕词
2015/01/29 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书
Python selenium模拟网页点击爬虫交管12123违章数据
2021/05/26 Python
mysql left join快速转inner join的过程
2021/06/30 MySQL