this 在函数调用时确定(箭头函数除外),规则按优先级大致为:

  1. new 调用:指向新创建的对象;
  2. call/apply/bind 显式指定:指向传入的第一个参数;
  3. 作为对象方法调用:obj.fn() 指向 obj
  4. 独立调用:严格模式下为 undefined,非严格模式为全局对象;
  5. 箭头函数没有自己的 this,捕获定义处外层作用域的 this,且不可被 call 等改变。

三者区别:

fn.call(obj, 1, 2);    // 立即调用,参数逐个传
fn.apply(obj, [1, 2]); // 立即调用,参数用数组
const f = fn.bind(obj); // 不调用,返回绑定了 this 的新函数

易错点:回调函数丢失 this(如 setTimeout(obj.fn)this 指向全局);bind 后的函数再 call 无效。追问:手写 call/bind 的实现、newbind 同时存在时 new 优先。