箭头函数不绑定this,而是沿作用域链向上查找最近的非箭头函数执行时的this值,即this穿透;该机制由词法作用域决定,静态绑定,不受调用方式影响。

箭头函数本身不绑定 this,它会沿作用域链向上查找外层普通函数的 this 值——这叫 this 穿透,不是“继承”也不是“捕获”,而是词法作用域决定的静态绑定。
箭头函数没有自己的 this,直接沿外层找
普通函数调用时,this 由调用方式(如 obj.fn()、fn.call(obj))动态决定;而箭头函数内部没有 this 绑定,每次访问 this 都会一层层往外找,直到遇到第一个非箭头函数的作用域,并使用那个函数执行时的 this 值。
- 如果外层是全局普通函数,那箭头函数的
this就是该函数运行时的this(可能是window、undefined或显式绑定的对象) - 如果外层是对象方法(普通函数),且通过
obj.method()调用,那么箭头函数里的this就等于obj - 如果外层普通函数被
call/apply改变了this,箭头函数也会反映这个变化
嵌套多层时,只看最近的普通函数作用域
this 穿透不会跳过中间的箭头函数,也不会跨过普通函数。它只关心“紧邻的、向外第一个普通函数执行上下文”的 this。
例如:
立即学习“Java免费学习笔记(深入)”;
const obj = { name: 'Alice', regular() { console.log(this.name); // 'Alice' const arrow1 = () => { console.log(this.name); // 'Alice' —— 穿透到 regular 的 this const arrow2 = () => { console.log(this.name); // 'Alice' —— 仍穿透到 regular 的 this,不经过 arrow1 }; arrow2(); }; arrow1(); } }; obj.regular();常见陷阱:事件回调或定时器中误用箭头函数
在 DOM 事件或 setTimeout 中,若想让回调里的 this 指向触发元素或某个实例,但错误地用了箭头函数,就会因 this 穿透而拿到外层的 this,而非预期的上下文。
- 错误写法:
btn.addEventListener('click', () => console.log(this));→this是定义时外层函数的this,通常不是btn - 正确做法:用普通函数、
bind、或明确传入event.currentTarget - 类方法中需绑定
this时,不要用箭头函数包裹:类里写handler = () => {...}是 OK 的,但若在方法内再写箭头函数,它的this就是类实例(因为外层是构造上下文或类方法)
如何验证 this 穿透?用 debugger 或 console.log
最直接的方式是在外层普通函数和内层箭头函数里都打印 this,观察是否一致:
- 确保调试时运行环境没被 Babel/TS 编译干扰(原生 ES6+ 环境下行为最清晰)
- 注意严格模式下全局普通函数的
this是undefined,会影响穿透结果 - 可以用
console.log(new.target, this.constructor)辅助判断当前是否在构造函数上下文中










