call、apply、bind方法的实现

简介: 先分析下3个方法的作用改变this的指向。传入参数。call apply返回函数结果, bind 返回新函数一、call方法的实现改变this指向首先我们知道,对象上的方法,在调用时,this是指向对象的。

先分析下3个方法的作用

改变this的指向。

传入参数。

call apply返回函数结果, bind 返回新函数

一、call方法的实现

改变this指向

首先我们知道,对象上的方法,在调用时,this是指向对象的。

img_672728664bb3d24fa066f9f950741af6.png

知道了这一点我们就可以实现改变this的指向

img_6e0aad6c28b1e07bd096ecb231ee7d49.png

测试

img_ffcf7b921852687297a27d35c1d026c3.png

现在,改变this的值,实现了

最简单实现es6

img_7a223ea1fc97aaa3be6b13519a5fe1c4.png

二、apply方法的实现

其实apply和call差不多,没什么大区别

利用已经写好的myCall来实现

img_a440ca7003a039299528e3a34c3a2869.png

不用myCall

img_7abe7954cf5f882256c227c385ae4abe.png

测试

img_7115ee524d4fe69c4deba076fa565cfc.png

效果没区别

三、bind方法的实现(利用call方法实现)

首先我们可以通过给目标函数指定作用域来简单实现bind()方法:

img_3c8096b8c58758177e32183d841ac555.png

考虑到函数柯里化的情况,我们可以构建一个更加健壮的bind():

img_775f20524b4c595f9fda9cd00fe760f9.png

这次的bind()方法可以绑定对象,也支持在绑定的时候传参。

继续,Javascript的函数还可以作为构造函数,那么绑定后的函数用这种方式调用时,情况就比较微妙了,需要涉及到原型链的传递:

img_66732ad501eb147d39f23697c0531fcb.png

这是《JavaScript Web Application》一书中对bind()的实现:通过设置一个中转构造函数F,使绑定后的函数与调用bind()的函数处于同一原型链上,用new操作符调用绑定后的函数,返回的对象也能正常使用instanceof,因此这是最严谨的bind()实现。

对于为了在浏览器中能支持bind()函数,只需要对上述函数稍微修改即可:

img_eb04b1503a3f9221152bd45db919dbcd.png
img_83a21cd0b4843eeba48365fa98042b30.png

四、模拟代码

模拟call

img_fbad936f5cd5bf63964dac8e222df5b6.png

模拟apply

img_183b4bc809e605f5ac1249910e28d178.png

模拟bind

img_81da298741d40aca936c5fcf5a9d2f18.png
相关文章
|
9月前
|
机器学习/深度学习 人工智能 机器人
TIGER:清华突破性模型让AI「听觉」进化:参数量暴降94%,菜市场都能分离清晰人声
TIGER 是清华大学推出的轻量级语音分离模型,通过时频交叉建模和多尺度注意力机制,显著提升语音分离效果,同时降低参数量和计算量。
787 6
TIGER:清华突破性模型让AI「听觉」进化:参数量暴降94%,菜市场都能分离清晰人声
|
算法 安全 程序员
【C++ 随机数生成器】深入解析C++ 随机数生成器mersenne_twister_engine等
【C++ 随机数生成器】深入解析C++ 随机数生成器mersenne_twister_engine等
736 0
|
机器学习/深度学习 存储 文字识别
图像数字识别、数字分割(OCR识别,毕业设计)
图像数字识别、数字分割(OCR识别,毕业设计)
|
负载均衡 Cloud Native 数据可视化
zookeeper、nacos与Eureka的详细区别介绍
Zookeeper、Nacos和Eureka都是常见的服务注册与发现框架,它们在分布式系统中起着至关重要的作用。虽然它们的目标都是实现服务的注册和发现,但在设计和功能上存在一些区别。下面我将详细介绍它们的特点和区别。
2535 0
|
2天前
|
弹性计算 运维 搜索推荐
三翼鸟携手阿里云ECS g9i:智慧家庭场景的效能革命与未来生活新范式
三翼鸟是海尔智家旗下全球首个智慧家庭场景品牌,致力于提供覆盖衣、食、住、娱的一站式全场景解决方案。截至2025年,服务近1亿家庭,连接设备超5000万台。面对高并发、低延迟与稳定性挑战,全面升级为阿里云ECS g9i实例,实现连接能力提升40%、故障率下降90%、响应速度提升至120ms以内,成本降低20%,推动智慧家庭体验全面跃迁。
|
3天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
351 91
|
10天前
|
人工智能 自然语言处理 前端开发
Qoder全栈开发实战指南:开启AI驱动的下一代编程范式
Qoder是阿里巴巴于2025年发布的AI编程平台,首创“智能代理式编程”,支持自然语言驱动的全栈开发。通过仓库级理解、多智能体协同与云端沙箱执行,实现从需求到上线的端到端自动化,大幅提升研发效率,重塑程序员角色,引领AI原生开发新范式。
850 156
|
3天前
|
数据采集 缓存 数据可视化
Android 无侵入式数据采集:从手动埋点到字节码插桩的演进之路
本文深入探讨Android无侵入式埋点技术,通过AOP与字节码插桩(如ASM)实现数据采集自动化,彻底解耦业务代码与埋点逻辑。涵盖页面浏览、点击事件自动追踪及注解驱动的半自动化方案,提升数据质量与研发效率,助力团队迈向高效、稳定的智能化埋点体系。(238字)
257 156