JavaScript中this的绑定规则优先级为:new绑定>显式绑定>隐式绑定>默认绑定。new绑定指向新实例,显式绑定通过call/apply/bind指定this,隐式绑定依赖对象方法调用形式,默认绑定在独立调用时生效。

“this” 的指向不是看函数怎么定义,而是看它怎么被调用。JavaScript 中 this 的绑定只有四种规则,优先级从高到低依次是:new 绑定 > 显式绑定(call/apply/bind) > 隐式绑定(对象方法调用) > 默认绑定(独立函数调用)。理解错顺序,就容易掉坑。
new 绑定:构造函数调用时 this 指向新创建的对象
当函数通过 new 调用时,无论函数内部是否手动绑定过 this,new 会强制让 this 指向新生成的实例对象。这是最高优先级的绑定。
- 哪怕函数已用 bind 固定了 this,new 仍会覆盖它(bind 返回的函数被 new 调用时,原绑定失效)
- 函数体内若显式 return 一个对象,不影响 this 指向——this 始终是新对象;但若 return 基本类型值(如 number、string),则忽略,仍返回新对象
显式绑定:call、apply、bind 直接指定 this 值
通过 call、apply 或 bind 主动传入 this 参数,就能明确控制函数执行时的 this 指向。其中 bind 返回的是一个新函数,其 this 被永久锁定。
- call 和 apply 立即执行,区别只在参数传递方式(后者用数组)
- bind 不执行,返回柯里化函数;多次 bind 只有第一次生效(后续 bind 不会覆盖首次绑定的 this)
- 箭头函数没有自己的 this,所以 call/apply/bind 对它无效——它继承外层作用域的 this
隐式绑定:对象方法调用时 this 指向调用它的对象
当函数作为对象的属性被调用(如 obj.foo()),this 默认绑定到该对象。这是最常见也最容易被破坏的场景。
- 必须满足“点引用 + 立即调用”的形式;一旦拆开(如 let fn = obj.foo; fn()),就退化为默认绑定
- 嵌套对象中,this 指向的是紧邻的调用者,不是最外层对象(例如 obj.inner.method() 中 this 是 inner,不是 obj)
- 事件回调中,比如 btn.addEventListener('click', obj.handler),handler 的 this 默认是 btn,不是 obj —— 这常被误认为是隐式绑定,实际属于默认绑定(因为 handler 是被浏览器以 btn 为上下文调用的)
默认绑定:独立调用时 this 指向全局或 undefined
函数不通过任何方式绑定,直接调用(如 foo()),就触发默认绑定。严格模式下 this 是 undefined;非严格模式下指向全局对象(浏览器中是 window)。
- 箭头函数不遵循此规则——它没有 this,直接沿用外层函数的 this 值
- 嵌套函数中的 this 不会继承外层函数的 this,除非外层显式绑定或用箭头函数
- 模块顶层的 this 在 ES6 模块中总是 undefined(模块自动启用严格模式)
这四条规则不是靠猜,而是按固定顺序判断:遇到 new 就停,否则看有没有 call/apply/bind,再看是不是对象.方法调用,最后才走默认。理清这个流程,this 就不再玄学。

















