箭头函数不绑定this,继承外层作用域的this,无法通过call/apply/bind修改;普通函数this由调用方式动态决定,可作为构造函数。

箭头函数不绑定自己的 this,而是继承外层作用域的 this 值;普通函数则根据调用方式动态绑定 this,容易变化。
箭头函数:this 由定义时外层决定
箭头函数没有独立的 this,它会沿作用域链向上查找,使用最近一层普通函数或全局作用域中的 this。这意味着无论怎么调用,它的 this 都不会变。
- 不能用 call、apply、bind 修改 this
- 在对象方法中使用时,this 指向外层(比如构造函数或全局),不是当前对象
- 适合用在回调、事件处理器等需要保持外层 this 的场景
普通函数:this 由调用方式决定
普通函数的 this 在执行时才确定,取决于函数如何被调用。
- 直接调用(如 fn())→ this 指向 undefined(严格模式)或 window(非严格模式)
- 作为对象方法调用(如 obj.fn())→ this 指向该对象
- 用 call/apply/bind 调用 → this 显式指定为传入的第一个参数
- 构造函数调用(new Fn())→ this 指向新创建的实例
常见陷阱对比
以下代码能清晰体现差异:
const obj = {
name: 'Alice',
regular() {
console.log(this.name); // 'Alice'
setTimeout(function() {
console.log(this.name); // undefined(非严格模式下是 window)
}, 100);
setTimeout(() => {
console.log(this.name); // 'Alice',箭头函数继承 regular 的 this
}, 100);
}
};
- 普通函数回调中 this 丢失是常见问题,需用 bind、闭包或改写为箭头函数修复
- 箭头函数不能作为构造函数,也没有 arguments 和 prototype
- Vue/React 等框架中,生命周期钩子或事件回调若用箭头函数,可能意外捕获到组件外的 this
怎么选?看 this 是否需要动态绑定
不需要动态 this —— 比如工具函数、异步回调、数组遍历中的处理函数,优先用箭头函数;需要明确绑定到调用者 —— 比如对象方法、事件监听器(且希望 this 是触发元素)、构造逻辑,就用普通函数。
- 类的方法默认是普通函数,可配合 bind 或 class 字段语法(fn = () => {})固定 this
- 箭头函数适合“只读”上下文,普通函数适合“行为归属明确”的场景
- 调试时注意:箭头函数在堆栈中不显示函数名,普通函数更易追踪











