彻底搞懂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限定图片显示大小的方法
Mar 11 Javascript
再JavaScript的jQuery库中编写动画效果的指南
Aug 13 Javascript
如何实现JavaScript动态加载CSS和JS文件
Dec 28 Javascript
JavaScript统计网站访问次数的实现代码
Nov 18 Javascript
悬浮广告方法日常收集整理
Mar 18 Javascript
微信小程序中用WebStorm使用LESS
Mar 08 Javascript
weex里Vuex state使用storage持久化详解
Sep 09 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
Sep 19 Javascript
vue使用$emit时,父组件无法监听到子组件的事件实例
Feb 26 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
Apr 08 Javascript
jQuery插件jsonview展示json数据
May 26 jQuery
vue 获取及修改store.js里的公共变量实例
Nov 06 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
php获取文件名称和扩展名的方法
2017/02/07 PHP
Yii2数据库操作常用方法小结
2017/05/04 PHP
关于jQuery object and DOM element
2013/04/15 Javascript
Ext修改GridPanel数据和字体颜色、css属性等
2014/06/13 Javascript
jQuery向父辈遍历的简单方法
2016/09/18 Javascript
微信小程序 textarea 详解及简单使用方法
2016/12/05 Javascript
JavaScript正则表达式简单实用实例
2017/06/23 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
2017/12/10 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
深入探讨JavaScript的最基本部分之执行上下文
2019/02/12 Javascript
Node.js事件的正确使用方法
2019/04/05 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
Layui 带多选框表格监听事件以及按钮自动点击写法实例
2019/09/02 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
jQuery实现购物车全功能
2021/01/11 jQuery
python僵尸进程产生的原因
2017/07/21 Python
python实现电脑自动关机
2018/06/20 Python
pandas 按照特定顺序输出的实现代码
2018/07/10 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
Python将string转换到float的实例方法
2019/07/29 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
Python OpenCV视频截取并保存实现代码
2019/11/30 Python
python将数组n等分的实例
2019/12/02 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
Python连接SQLite数据库并进行增册改查操作方法详解
2020/02/18 Python
django美化后台django-suit的安装配置操作
2020/07/12 Python
萌新的HTML5 入门指南
2020/11/06 HTML / CSS
法国足球商店:Footcenter
2019/07/06 全球购物
华为智利官方商店:Huawei Chile
2020/05/09 全球购物
工作粗心大意检讨书
2014/09/18 职场文书
保险公司反洗钱宣传活动总结
2015/05/08 职场文书
公司费用报销管理制度
2015/08/04 职场文书
用python画城市轮播地图
2021/05/28 Python
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python