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

发布时间 - 2026-01-11 03:17:08    点击率:

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方法(必看)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# js中的call和apply  # JS中call()和apply()的功能及用法实例分析  # js中call()和apply()改变指针问题的讲解  # js中apply()和call()的区别与用法实例分析  # js中apply与call简单用法详解  # 详解JS中的this、apply、call、bind(经典面试题)  # 详解js中的apply与call的用法  # JS中改变this指向的方法(call和apply、bind)  # JS call()及apply()方法使用实例汇总  # 都是  # 可以通过  # 给大家  # 有一个  # 放在  # 不太  # 遍历  # 其他的  # 你想  # 我们可以  # 而不  # 希望能  # 它可以  # 这篇  # 不确定  # 则可  # 必看  # 对它  # 方法来  # 经常会 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  实例解析Array和String方法  Java垃圾回收器的方法和原理总结  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  如何选择可靠的免备案建站服务器?  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  EditPlus中的正则表达式实战(6)  简单实现Android文件上传  如何在阿里云高效完成企业建站全流程?  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  b2c电商网站制作流程,b2c水平综合的电商平台?  如何登录建站主机?访问步骤全解析  创业网站制作流程,创业网站可靠吗?  无锡营销型网站制作公司,无锡网选车牌流程?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  佛山网站制作系统,佛山企业变更地址网上办理步骤?  如何将凡科建站内容保存为本地文件?  C++时间戳转换成日期时间的步骤和示例代码  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  jquery插件bootstrapValidator表单验证详解  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  微信小程序 input输入框控件详解及实例(多种示例)  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  成都网站制作公司哪家好,四川省职工服务网是做什么用?  Laravel安装步骤详细教程_Laravel环境搭建指南  如何快速搭建二级域名独立网站?  WordPress 子目录安装中正确处理脚本路径的完整指南  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  java中使用zxing批量生成二维码立牌  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  JS经典正则表达式笔试题汇总  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  如何快速搭建支持数据库操作的智能建站平台?  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  EditPlus中的正则表达式实战(5)  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  油猴 教程,油猴搜脚本为什么会网页无法显示?  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  百度浏览器如何管理插件 百度浏览器插件管理方法  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  用v-html解决Vue.js渲染中html标签不被解析的问题  如何在腾讯云服务器上快速搭建个人网站?