箭头函数的this在定义时词法捕获外层第一个普通函数的this值,不随调用方式改变;普通函数的this则取决于调用时的上下文。

箭头函数里的 this 不是运行时决定的,而是在定义时就“记住”了外层普通函数的 this 值——这个过程叫词法捕获。它不看你怎么调用,只看它写在哪一层作用域里。
箭头函数的 this 从哪来?
它会一层层往外找,直到遇到第一个普通函数(非箭头),取那个函数执行时的 this;如果一直找到全局作用域,就取全局对象(浏览器中是 window,严格模式下是 undefined)。
- 外层是对象方法 → 箭头函数的
this就是该对象 - 外层是类的方法 →
this就是当前实例 - 外层是独立函数(没绑定)→
this是全局对象或undefined - 外层没有普通函数(比如直接写在模块顶层)→
this是模块的this(通常为undefined)
常见陷阱:误以为 thisArg 能影响箭头函数
forEach、map 这些方法支持传入第二个参数 thisArg,但它只对普通函数回调生效。箭头函数完全无视它。
- ✅ 正确做法:用回调的第三个参数获取原数组(如
arr) - ✅ 或者把需要的数据提前存到外层变量里(比如
const self = this) - ❌ 不要写
arr.forEach(() => {}, this)—— 第二个参数被忽略
对比普通函数看区别
普通函数的 this 取决于调用方式(谁调用、怎么调),而箭头函数的 this 只取决于它在哪定义。
立即学习“Java免费学习笔记(深入)”;
- 事件监听器用普通函数:
this指向触发它的 DOM 元素 - 事件监听器用箭头函数:
this指向外层上下文(比如组件实例或window) - 定时器里用箭头函数:
this是外层方法的this,不是定时器内部对象
怎么验证你理解对了?
写个小测试:在对象方法里定义一个箭头函数,再在它里面打印 this,同时把同位置换成普通函数对比输出。
- 如果两者输出一样 → 外层
this没变,箭头函数确实继承了 - 如果普通函数输出变了(比如变成
Window)→ 说明它被重新绑定了,而箭头函数稳住不动 - 关键点:不要靠“看起来像”判断,要实际
console.log(this)


















