箭头函数不能用作构造函数,无arguments、prototype和动态this绑定;其this词法继承且定义时确定,适合数组回调和保持外层this的异步场景,但不适用于对象方法、事件监听器或需arguments/new.target的场合。

箭头函数不能用作构造函数,也没有 arguments、prototype 和 this 绑定——这不是“语法糖”,而是行为根本不同。
普通函数的 this 是动态绑定的
每次调用时,this 值取决于调用方式(谁调用、怎么调用):
- 对象方法中:指向该对象(
obj.fn()→this === obj) - 单独调用:
this指向全局对象(非严格模式)或undefined(严格模式) - 被
call/apply/bind显式指定时:按传入值确定
这意味着你可以在运行时控制 this,比如事件回调里用 fn.bind(obj) 或保存 const self = this。
箭头函数的 this 是词法继承的
它没有自己的 this,而是沿作用域链向上找外层普通函数或全局作用域的 this 值,且**定义时就确定,无法被改变**:
立即学习“Java免费学习笔记(深入)”;
const obj = {
name: 'test',
regular() {
console.log(this.name); // 'test'
setTimeout(function() {
console.log(this.name); // undefined(非严格模式下是 window)
}, 100);
setTimeout(() => {
console.log(this.name); // 'test',继承自 regular()
}, 100);
}
};所以箭头函数不适合当对象方法、事件监听器(需访问触发元素时)、或需要被 new 调用的构造函数。
箭头函数没有 arguments 和 caller/callee
在普通函数内部,arguments 是类数组对象,记录传入参数;箭头函数里访问 arguments 会报 ReferenceError:
- 替代方案:用剩余参数
...args - 如果需要模拟
arguments.callee(例如递归匿名函数),必须改用普通函数声明或命名函数表达式 -
new.target在箭头函数中也无效,因此无法判断是否被new调用
这使得箭头函数无法用于需要反射式参数处理的场景,比如封装通用装饰器或兼容旧版 API 的适配层。
什么时候该用箭头函数?
核心判断标准:**是否需要独立的 this、arguments 或构造能力**。适合的场景包括:
- 数组方法回调:
[1,2,3].map(x => x * 2) - 异步回调中保持外层
this:setTimeout(() => this.doSomething(), 100) - 简化短小的单表达式逻辑(无副作用、不依赖运行时上下文)
但注意:过度嵌套箭头函数会让 this 链变得难追踪;若外层函数 this 本身是 undefined(如模块顶层箭头函数中),那内层箭头函数的 this 也是 undefined——这点常被忽略。











