标准答案

  1. 普通函数 this:主要看调用方式,可以按优先级记为 new 绑定、显式绑定、隐式绑定、默认绑定。new 调用时 this 指向新对象;call、apply、bind 调用时指向显式传入的对象;作为对象方法调用时通常指向点号前面的对象;直接调用时,严格模式下是 undefined,非严格模式下会指向全局对象。
  2. 箭头函数 this:箭头函数没有自己的 this、arguments、super 和 new.target。它的 this 来自定义时外层词法作用域,之后用 call、apply、bind 都改不了。
  3. 适用场景:箭头函数适合在回调里保留外层 this,例如定时器、数组方法、Promise 回调或 Vue/React 里不希望 this 被调用方式改掉的函数。
  4. 不适合场景:箭头函数不适合作为对象原型方法、构造函数或需要动态 this 的事件回调。不要用一句“this 指向调用者”概括所有场景,因为 new、bind 和箭头函数都会让这句话失效。

题目解析

this 是运行时绑定,词法作用域是定义时决定。箭头函数的 this 反而更接近词法规则,因为它捕获外层 this。

DOM 事件里普通函数监听器的 this 通常是绑定事件的元素;箭头函数不会自动指向元素。如果业务依赖事件元素,更推荐用 event.currentTarget。

代码示例

这段代码能说明对象方法丢失 this,以及 bind 固定 this 的场景。

JavaScript
const user = {
  name: 'Alice',
  say() {
    console.log(this.name)
  }
}

user.say() // Alice

const say = user.say
// say() // 严格模式下 this 是 undefined

const fixedSay = user.say.bind(user)
fixedSay() // Alice

常见误区

  • 误以为 this 永远指向函数定义所在对象。普通函数的 this 主要由调用方式决定。
  • 误以为箭头函数的 this 可以用 bind 修改。
  • 在对象方法或 class 原型方法里滥用箭头函数,导致 this 语义不符合预期。

作者信息