JS中如何在一个方法内调用另一个方法?this使用详解
(深吸一口气)咱们今天来聊聊这个让新手抓狂的问题——明明写了两个方法,怎么就让它们互相调用了呢?哎,你是不是也遇到过这种情况:在方法A里调用方法B,结果浏览器直接给你甩个"undefined is not a function"?别慌,我当年对着屏幕啃指甲的样子,和现在的你一模一样!
一、先搞懂最基础的调用姿势
(敲黑板)咱们先来看段代码:
javascript复制const robot = { sayHi() { console.log("你好呀!"); this.sayBye(); // 这里想调用另一个方法 }, sayBye() { console.log("再见咯~"); } }
这时候要是直接robot.sayHi()
,你会发现两个问候语都能正常输出。但是!(突然提高音量)如果改成这样:
javascript复制const hiFunc = robot.sayHi; hiFunc(); // 完犊子!报错了!
为什么同样的方法换个姿势调用就翻车?这就是咱们今天要破解的??this之谜??。
二、这个鬼畜的this到底是谁?
(挠头)先做个实验吧!在方法里加一句console.log(this)
,你会发现:
- 当用
robot.sayHi()
调用时,this指向robot对象 - 用
hiFunc()
调用时,this竟然变成window(浏览器环境)或undefined(严格模式)
(拍大腿)原来问题的症结在这里!方法能不能互相调用,全看this有没有指对地方。就像你去咖啡店点单,对着空气喊"我要拿铁",服务员肯定不搭理你——得找准对象才行。
三、三大保命绝招搞定this
(竖起三根手指)我常用的解决方案就这三个:
-
??箭头函数大法??
把方法改成箭头函数:javascript复制
const robot = { sayHi: () => { console.log("你好呀!"); this.sayBye(); // 现在this指向外层作用域 } }
(小声bb)不过这个方法有副作用,就像吃火锅配冰淇淋,可能拉肚子...
-
??bind强行绑定??
像给野马套缰绳:javascript复制
constructor() { this.sayHi = this.sayHi.bind(this); }
适合用在class里,相当于给方法打预防针。
-
??胖箭头调用法??
临时抱佛脚的时候这么写:javascript复制
robot.sayHi = () => { this.sayBye(); }
(突然笑出声)这个方法就像临时工,用起来方便但别长期依赖!
四、真实案例翻车现场
(扶额)去年我接了个外包项目,有个搜索框要连续触发两个校验方法。结果用户快速输入时,第二个方法死活不执行。最后发现是回调函数里的this指向了事件对象,而不是组件实例。解决方案?用了个双重保险:
javascript复制handleInput = (e) => { this.validateFormat(); // 像这样双重绑定 this.validateLength.apply(this); }
(敲桌子)重点来了:??当方法需要传递参数时,记得用call或apply来锁死this??!
五、个人踩坑心得
干了五年前端,我发现90%的"方法调用失败"都是this在作妖。现在养成了三个习惯:
- 在class组件里必用bind(就像出门必带手机)
- 写工具函数时优先用箭头函数(但会注意不要滥用)
- 看到方法调用就条件反射检查this指向(跟检查煤气灶一个道理)
(突然压低声音)偷偷告诉你们,我现在看到普通函数定义都会起鸡皮疙瘩...(笑)
最后说句掏心窝子的话:别被这个this吓住,它就像你家猫主子——摸顺毛了其实挺温顺的。多写几个案例,多在控制台打印this看看,保准你两三天就能驯服它!下次要是再遇到this乱跑的情况,记得回来看看这篇血泪总结哈~
本文由嘻道妙招独家原创,未经允许,严禁转载