this 在函数调用时确定(箭头函数除外),规则按优先级大致为:
new调用:指向新创建的对象;call/apply/bind显式指定:指向传入的第一个参数;- 作为对象方法调用:
obj.fn()指向obj; - 独立调用:严格模式下为
undefined,非严格模式为全局对象; - 箭头函数没有自己的
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 的实现、new 与 bind 同时存在时 new 优先。