箭头函数没有自己的this,因其不绑定独立执行上下文而词法继承外层this,无法通过call/apply/bind修改,也不能作为构造函数或访问arguments;普通函数则依调用方式动态确定this。

箭头函数没有自己的 this,是因为它**不绑定独立的执行上下文**,而是直接继承外层普通函数(或全局作用域)的 this 值。这和传统函数通过调用方式动态确定 this 的机制完全不同。
箭头函数的 this 是词法绑定的
词法绑定意味着 this 的值在函数定义时就已确定,不是在调用时才决定。它沿作用域链向上查找,取最近一层普通函数的 this;如果外层没有函数,则指向全局对象(浏览器中是 window,严格模式下是 undefined)。
- 无法通过
call、apply、bind改变箭头函数的this - 不能作为构造函数使用(调用会报错)
- 没有
arguments对象,也没有prototype属性
对比普通函数:调用方式决定 this
普通函数的 this 取决于调用位置和方式:
-
obj.method()→this指向obj -
func()(独立调用)→ 非严格模式下指向window,严格模式下为undefined -
func.call(obj, ...)→this强制绑定为obj
而箭头函数完全跳过这套规则,只认定义时所在作用域的 this。
立即学习“Java免费学习笔记(深入)”;
常见陷阱与应对场景
最典型的问题出现在对象方法或事件回调中:
const obj = {
name: 'Alice',
regular() {
console.log(this.name); // 'Alice'
setTimeout(function() {
console.log(this.name); // undefined(this 指向 window)
}, 100);
setTimeout(() => {
console.log(this.name); // 'Alice'(继承 regular 的 this)
}, 100);
}
};
这时用箭头函数能自然捕获外层 this,避免手动绑定(如 bind 或变量缓存 const self = this)。
什么时候不该用箭头函数
当需要动态 this 时,必须用普通函数:
- 定义对象方法(尤其是希望方法内
this指向调用对象) - 需要被
new调用的构造器 - 使用
call/apply显式传入上下文的场景 - Vue/React 等框架中依赖
this指向实例的方法(如 Vue 的选项式 API)
简单说:想让 this 随调用变,就用普通函数;想让它“固定”在定义位置的上下文,就用箭头函数。


















