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
相关文章
|
11月前
|
机器学习/深度学习 人工智能 机器人
TIGER:清华突破性模型让AI「听觉」进化:参数量暴降94%,菜市场都能分离清晰人声
TIGER 是清华大学推出的轻量级语音分离模型,通过时频交叉建模和多尺度注意力机制,显著提升语音分离效果,同时降低参数量和计算量。
1040 6
TIGER:清华突破性模型让AI「听觉」进化:参数量暴降94%,菜市场都能分离清晰人声
|
算法 安全 程序员
【C++ 随机数生成器】深入解析C++ 随机数生成器mersenne_twister_engine等
【C++ 随机数生成器】深入解析C++ 随机数生成器mersenne_twister_engine等
844 0
|
机器学习/深度学习 存储 文字识别
图像数字识别、数字分割(OCR识别,毕业设计)
图像数字识别、数字分割(OCR识别,毕业设计)
|
负载均衡 Cloud Native 数据可视化
zookeeper、nacos与Eureka的详细区别介绍
Zookeeper、Nacos和Eureka都是常见的服务注册与发现框架,它们在分布式系统中起着至关重要的作用。虽然它们的目标都是实现服务的注册和发现,但在设计和功能上存在一些区别。下面我将详细介绍它们的特点和区别。
2700 0
|
4天前
|
云安全 人工智能 算法
以“AI对抗AI”,阿里云验证码进入2.0时代
三层立体防护,用大模型打赢人机攻防战
1317 4
|
4天前
|
机器学习/深度学习 安全 API
MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
667 3
|
5天前
|
人工智能 Rust 运维
这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
|
11天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
773 6