JavaScript中this的最终指向由调用时的绑定规则按优先级决定:new绑定最高,显式绑定次之,隐式绑定再次,默认绑定兜底;箭头函数不参与此四条规则,直接继承词法作用域的this。

JavaScript中this的最终指向,由函数调用时触发的绑定规则按固定优先级决定——不是“多个规则同时生效”,而是只有一条规则胜出。关键在于:遇到调用,从最高优先级开始逐条检查,一旦匹配就停止判断。
new 绑定优先级最高
只要函数是通过 new 关键字调用,无论它是否被 bind 过、是否作为对象方法存在,this 都指向新创建的实例对象。
- 即使你对构造函数做了
bind(obj),再用new boundFn()调用,原绑定失效,this 仍是新实例 - 箭头函数不能被 new 调用,会直接报错,所以不参与此规则
- 示例:
const F = function() { return { x: 1 } }; const bound = F.bind({ y: 2 }); new bound()→ this 指向新对象,且最终返回的是手动返回的{x: 1}(忽略绑定)
显式绑定次之(call/apply/bind)
当调用使用了 call、apply 或 bind,且该调用未被 new 覆盖时,this 就取你传入的第一个参数(除非是 null/undefined 且非严格模式,会被自动替换为全局对象)。
-
bind返回的函数,后续再用call试图改 this 是无效的(硬绑定已锁定) - 但若对该绑定函数再执行
new,则显式绑定被覆盖,回到 new 绑定规则 - 注意:
call(null)在非严格模式下 this 实际是window,不是null
隐式绑定仅在“点调用”且无更高规则时生效
形如 obj.method() 的调用,才可能触发隐式绑定。但它极易被破坏:
立即学习“Java免费学习笔记(深入)”;
- 赋值后调用:
const fn = obj.method; fn()→ 退化为默认绑定 - 传入回调:
setTimeout(obj.method, 100)→ 同样退化 - 嵌套对象只看最后一层点号左侧:
obj.a.b.c()中 this 指向obj.a.b,不是obj
默认绑定兜底,严格模式更安全
当以上三条都不满足(即普通函数调用),就走默认绑定:
- 非严格模式:
this指向window(浏览器)或global(Node.js) - 严格模式:
this为undefined,避免意外污染全局 - 常见陷阱:事件监听器、定时器回调、数组方法(如
arr.map(fn))里的fn默认都是这一条
箭头函数不参与四条规则,单独处理
它没有自己的 this,完全继承定义时所在词法作用域的 this 值,且无法被 call/apply/bind 或 new 修改。
- 在对象方法中写
() => this.xxx,this 不是该对象,而是外层函数(比如 class 构造器或模块顶层)的 this - 适合用于保持外层上下文,比如事件回调中避免手动
bind - 不能用作构造函数,也不能用
call强行指定 this


















