问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JS封装自己的call、apply和bind方法详解

发布网友 发布时间:2024-10-05 10:55

我来回答

1个回答

热心网友 时间:2024-10-09 06:05

在封装之前我们先来复习一下this指向。

所谓的this其实可以理解成一根指针:其实 this 的指向,始终坚持一个原理:this 永远指向最后调用它的那个对象,这就是精髓。最关键所在

this的四种指向:当this所在的函数被普通调用时,指向window,如果当前是严格模式,则指向undefined

当this所在当函数被以obj.fn()形式调用时,指向obj

当call,apply加入后,this的指向被改变了

此时控制台并没有代码输出,因为bind会重新生成并且返回一个函数,这个函数的this指向第一个参数

function a() { console.log(this.name); } const b = { name: "segmentFault" } a.bind(b, 1, 2, 3)此时输出segmentFault

正式开始自己实现call :

在函数原型上定义自己的myCall方法:

Function.prototype.myCall = function (context, ...arg) { const fn = Symbol('临时属性') context[fn] = this context[fn](...arg) delete context[fn] }

四行代码实现了简单的call,思路如下:

为了简化,今天都不做类型判断和错误边际处理,只把原理讲清楚。

自己实现apply:

//实现自己的myApply Function.prototype.myApply = function (context, arg) { const fn = Symbol('临时属性') context[fn] = this context[fn](...arg) delete context[fn] } const obj2 = { a: 1 } test.myApply(obj2, [2, 3, 4])

同理,只是apply传递的第二个参数是数组,这里我们只需要在调用时,将参数用...把数组展开即可

自己实现bind:

bind跟apply,call的本质区别,bind不会改变原函数的this指向,只会返回一个新的函数(我们想要的那个this指向),并且不会调用。但是apply和call会改变原函数的this指向并且直接调用

Function.prototype.myBind = function (objThis, ...params) { const thisFn = this; // 存储源函数以及上方的params(函数参数) // 对返回的函数 secondParams 二次传参 let fToBind = function (...secondParams) { console.log('secondParams',secondParams,...secondParams) const isNew = this instanceof fToBind // this是否是fToBind的实例 也就是返回的fToBind是否通过new调用 const context = isNew ? this : Object(objThis) // new调用就绑定到this上,否则就绑定到传入的objThis上 return thisFn.call(context, ...params, ...secondParams); // 用call调用源函数绑定this的指向并传递参数,返回执行结果 }; fToBind.prototype = Object.create(thisFn.prototype); // 复制源函数的prototype给fToBind return fToBind; // 返回拷贝的函数 };

学习需要循序渐进,建议根据本文顺序去封装一遍,是比较轻松的,当然bind还需要判断是否是new调用.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
孕妇梦见自己偷别人摘好放在路边的橘子 “云计算”的三个核心特点是什么 一个进程对应一个程序吗? 应用程序本地化 透水混凝土价格是多少一立方? 五立方八立方混凝土砂浆储存搅拌机发走 五百立米的水库钢筋制作代扎包工不包料要多少人工工资? y=(tanx)的cosx/2次方的导数 ...绘制了一幅图,现在要用1::25的比例打印,怎么在图纸上套一个A3的... ...画图的时候按1:1画的,出图的时候怎样设置成1:25的 有哪些判断腊肉品质的技巧分享? 如何判断腊肉的品质? 怎么判断腊肉的品质? 既然三清已经是道祖了,为啥道教内部还有虚皇五老比三清更大呢? 郴州森林公园排名_在郴州西站怎样去莽山国家森林公园 ...Xbox360手柄模拟补丁运行nba2k13出现游戏途中闪退的情况,求解_百度... 铁皮文件柜的尺寸和价格受哪些因素影响? 中级经济师实务哪个好 中级经济师哪个专业比较容易 Windows7系统开启混响模式的方法 中级经济师专业哪个简单 TikTok运营必备工具:FastData新增7大会员权益 加里·西尼斯人物简介 《特种部队:蛇眼起源》什么时候上映 剧情内容简介 ...寄回给我了,又不是什么贵重东西他丢掉好了,还回来算什么? ...分手了他把我所有联系方式都拉黑了我问她的衣服她说叫我帮她扔... 三白眼基本简介 word怎么通过身份证调出性别word怎么通过身份证调出性别和年龄_百度知 ... 蟒蛇洞简介 六爻子卯刑,关于六爻三刑的正确用法 星巴克团购高铁站能用吗,星巴克周边旅游 电脑没有本地连接了 连不上网 电脑连不上网 本地链接图标不在了 ...签名,头像,个人说明,空间名称,分组,不要关于爱的,要伤感,酷酷的,方... 鬼泣巅峰之战鬼泣手游礼包码7月12日(鬼泣巅峰之战是鬼泣几) 民事诉讼证据书证质证的顺序规定是什么? 民事诉讼中质证的顺序是怎样的? 民事诉讼原告的质证期有规定吗 民事诉讼质证期是在开庭前吗 有哪些电子支付 民事诉讼证人质证流程有什么 民事诉讼法关于证据质证有哪些规定? 民事诉讼中举证顺序的规定是怎么样的 民事诉讼举证后的程序是什么 白沙村历史沿革 怀孕44天hcg的正常值是多少 白沙村基础设施 华阴老腔和秦腔的区别:舞台大戏与说唱 ppt关闭完后再次打开提示修复?修复完打开是空白的了 裴琛宁小烟阿芷的小说叫什么名字