普通函数的this取决于调用方式,箭头函数的this继承自定义时的外层作用域;前者可被call/bind改变且能作构造函数,后者this固定不可改且不能new。

直接说结论:普通函数的 this 看“谁调用”,箭头函数的 this 看“在哪写”。这个区别不难记,但容易在实际代码里踩坑。
普通函数的 this:调用时才决定,谁喊它,它就听谁的
普通函数就像一个临时工,每次被叫去干活,都要现场确认“老板是谁”:
- 直接调用
fn()→ this 指向全局(非严格模式是window,严格模式是undefined) - 作为对象方法调用
obj.fn()→ this 指向obj - 用
new Fn()→ this 指向新创建的实例 - 用
fn.call(obj, ...)或bind→ this 被你手动指定为obj
箭头函数的 this:定义时就锁定,写在哪,就认哪的 this
箭头函数像一个“认亲不认人”的孩子——它没有自己的 this,出生那一刻就认准了外层函数(或全局)的 this,并且终身不变:
- 它不能用
call/apply/bind改 this(改也白改) - 它不能当构造函数(
new会报错) - 在定时器、事件回调、数组方法里,它天然保持外层上下文,不用
.bind(this)或存const self = this
典型场景对比:一眼看出该用谁
看两个常见例子:
-
对象方法中:
普通函数能访问this.name;箭头函数里的this是外层的,不是当前对象 → 容易输出undefined -
setTimeout 或 map 回调里:
普通函数里this会丢失(指向window);箭头函数自动继承外层this→ 更安全省心
一句话判断法
写函数前先问自己:
• 需要它随调用方式改变上下文?→ 用普通函数
• 需要它稳稳地记住当前环境的 this?→ 用箭头函数


















