彻底搞懂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 相关文章推荐
基于JQuery的asp.net树实现代码
Nov 30 Javascript
JS Replace 全部替换字符的用法小结
Dec 24 Javascript
快速学习jQuery插件 Cookie插件使用方法
Dec 01 Javascript
详解JavaScript基本类型和引用类型
Dec 09 Javascript
jQuery插件passwordStrength密码强度指标详解
Jun 24 Javascript
JavaScript两个变量交换值的实现方法
Mar 01 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
Apr 07 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
Sep 07 Javascript
微信小程序实现购物车代码实例详解
Aug 29 Javascript
JavaScript队列结构Queue实现过程解析
Mar 07 Javascript
uni-app使用countdown插件实现倒计时
Nov 01 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
Nov 12 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
解析htaccess伪静态的规则
2013/06/18 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
2016/01/11 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
JS中confirm,alert,prompt函数区别分析
2011/01/17 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
2013/08/01 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
2015/12/14 Javascript
学习JavaScript设计模式之策略模式
2016/01/12 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
2016/01/25 Javascript
jQuery判断元素是否显示 是否隐藏的简单实现代码
2016/05/19 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
JSON创建键值对(key是中文或者数字)方式详解
2017/08/24 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
angularjs实现猜大小功能
2017/10/23 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
解决Layui数据表格显示无数据提示的问题
2019/11/14 Javascript
详解Python命令行解析工具Argparse
2016/04/20 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
python使用MQTT给硬件传输图片的实现方法
2019/05/05 Python
python写程序统计词频的方法
2019/07/29 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
2019/10/12 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
2020/10/19 Python
分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)
2014/07/16 面试题
综合办公室个人的自我评价
2013/12/22 职场文书
母亲节演讲稿范文
2014/01/02 职场文书
节约用水演讲稿
2014/05/21 职场文书
美术专业自荐信
2014/07/07 职场文书
励志演讲稿300字
2014/08/21 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
装修公司工程部经理岗位职责
2015/04/09 职场文书
经理岗位职责范本
2015/04/15 职场文书