普通函数的this动态绑定,由调用方式决定;箭头函数无this,定义时继承外层this且永不改变,不支持new、call/apply/bind及arguments。

核心区别在于:普通函数的 this 是动态的,由调用时的上下文决定;箭头函数没有自己的 this,它在定义时就固定继承外层作用域的 this 值,之后永远不会变。
普通函数的 this 由调用方式决定
同一个函数,不同调用方式,this 指向完全不同:
- 直接调用(如
fn())→ 非严格模式下指向window,严格模式下为undefined - 作为对象方法调用(如
obj.method())→ this 指向obj - 被
call/apply/bind调用 → this 可被显式指定 - 用
new实例化 → this 指向新创建的实例 - 事件处理函数中 → this 默认指向触发事件的 DOM 元素
箭头函数的 this 在定义时就锁定
它不关心怎么调用,只认“出生地”的 this:
- 没有独立的 this 绑定机制,也不响应
call/apply/bind - 若定义在全局作用域,this 指向全局对象(浏览器中是
window) - 若定义在某个函数内部,就继承那个函数执行时的 this 值
- 嵌套多层箭头函数,每一层都沿用最外层捕获的 this,不会改变
典型场景对比:定时器里的 this
在对象方法中启动定时器,普通函数容易丢失 this,箭头函数天然保留:
- 普通函数写法需手动保存:
const that = this;或用bind(this) - 箭头函数自动继承外层 this,可直接访问对象属性,无需额外处理
不能用箭头函数替代的场合
以下情况必须用普通函数:
- 需要作为构造函数(
new Foo()),箭头函数不支持new - 需要动态绑定 this(比如事件监听器中希望 this 指向 DOM 元素)
- 需要访问
arguments对象(箭头函数没有自己的arguments) - 需要使用
yield写 Generator 函数











