this绑定优先级顺序为:new绑定最高,显式绑定次之,隐式绑定再次,默认绑定兜底;箭头函数无this,继承外层普通函数的this值。

new 绑定:最高优先级,构造调用直接锁定 this
只要函数被 new 调用,无论它是否被 bind 过、是否作为对象方法存在,this 都指向新创建的实例对象。
- new 操作内部会创建空对象、链接原型、把 this 绑定到该对象、最后返回它——第三步就已确定 this,不可覆盖
- 即使你写了
const boundFn = fn.bind({x:1}); new boundFn(),this 仍是新实例,不是 {x:1}
显式绑定:call / apply / bind 主动指定,次高优先级
当函数通过 call、apply 或 bind 调用时,this 被强制设为第一个参数(如 fn.call(obj) 中的 obj),且这个绑定在普通调用中无法被隐式或默认规则覆盖。
-
call和apply立即执行,区别只在参数传法(逐个 vs 数组) -
bind返回一个“硬绑定”函数,后续再用 call/apply 也无法改写它的 this(除非再 new 它)
隐式绑定:看调用时“点左边是谁”,日常最易出错
函数以 obj.method() 或 obj.nested.fn() 形式调用时,this 指向“点操作符左侧最近的那个对象”。注意:只认最后一层,不追溯整个链路。
-
obj.inner.fn()→ this 是inner,不是obj - 隐式容易丢失:赋值给变量(
const f = obj.fn; f())、传入回调(setTimeout(obj.fn, 100))、解构(const { fn } = obj)都会退化为默认绑定
默认绑定:兜底规则,独立调用时触发
当以上三条都不满足——函数既没被 new,也没被 call/apply/bind,也不是对象方法调用——就走默认绑定。
- 非严格模式:this 指向全局对象(浏览器是
window,Node.js 模块中是global或module.exports) - 严格模式(含
'use strict'):this 是undefined,访问this.xxx会直接报错
箭头函数:不参与优先级,它根本没自己的 this
箭头函数没有 this 绑定机制,它直接沿用外层第一个普通函数(非箭头)执行时的 this 值,且这个值在定义时就固定,运行时不会变,也无法被 call/apply/new 修改。
- 适合用在定时器、事件监听、Promise 回调等易丢失 this 的场景
- 不能用作构造函数(调用会报错),也没有
arguments和prototype











