上一篇
this
指向,让你的代码不再迷路 🧭最近JavaScript社区又热闹起来了!根据2025年8月的最新开发者调查报告,this
关键字依然是新手最容易踩坑的TOP3问题之一,不少小伙伴在面试时被问到"如何修改this
指向"直接懵圈,别担心,今天我们就用最白话的方式,彻底搞定这个磨人的小妖精!
this
是谁?为啥总变来变去?🤔简单说,this
就是当前代码执行时的"上下文对象",但它有个怪脾气——谁调用它,它就指向谁,看看这几个经典场景:
// 场景1:直接调用 -> 指向window(浏览器)/global(Node) function sayHi() { console.log(this); // window 🌍 } sayHi(); // 场景2:对象方法 -> 指向调用者 const cat = { name: '咪咪', meow: function() { console.log(this.name + '喵喵叫'); // 咪咪喵喵叫 🐱 } }; cat.meow(); // 场景3:DOM事件 -> 指向触发元素 button.addEventListener('click', function() { console.log(this); // <button>元素 🖱️ });
this
指向 🛠️当默认指向不符合预期时,我们就需要祭出三大法宝:
call()
—— 立即调用并指定this
function introduce(lang) { console.log(`我会${lang},我是${this.name}`); } const person = { name: '小明' }; introduce.call(person, 'JavaScript'); // 我会JavaScript,我是小明 👦
apply()
—— 参数用数组传递introduce.apply(person, ['Python']); // 我会Python,我是小明 🐍
bind()
—— 返回绑定后的新函数const boundFunc = introduce.bind(person); boundFunc('Java'); // 我会Java,我是小明 ☕
💡 小技巧:
call
和apply
的区别就像打电话——
call
是一个个报号码(参数列表)apply
是直接发通讯录(参数数组)
ES6的箭头函数没有自己的this
,它会"继承"外层作用域的this
:
const obj = { name: 'obj', regularFunc: function() { console.log(this); // obj ✅ }, arrowFunc: () => { console.log(this); // window 😱 } };
// 错误示范 ❌ setTimeout(obj.regularFunc, 1000); // 输出window
// 正确姿势 ✅ setTimeout(obj.regularFunc.bind(obj), 1000);
2. **多层嵌套时的`this`丢失**
```javascript
const game = {
players: ['A', 'B'],
start: function() {
this.players.forEach(function(player) {
console.log(this); // window 😭
});
}
};
// 解决方案:箭头函数或绑定this
this.players.forEach(player => {
console.log(this); // game对象 🎮
});
this
的替代方案 🚀随着函数式编程流行,越来越多的开发者开始:
this
混乱 this
类型检查 不过掌握this
修改技巧仍然是面试必备技能,毕竟老项目维护和某些特殊场景还是躲不开它~
记住口诀:普通函数看调用,箭头函数看定义,修改指向三兄弟,现在你可以自信地说:this
,拿捏了! 💪
本文由 桂濡霈 于2025-08-02发表在【云服务器提供商】,文中图片由(桂濡霈)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/518079.html
发表评论