隐式绑定只看调用时点号左侧对象:obj.method()中this为obj,obj.inner.say()中this为obj.inner,obj.a.b.c.fn()中this为obj.a.b.c;脱离“对象.方法()”形式则绑定失效。

函数作为对象方法调用时,this 的隐式绑定只看“谁在点号右边直接调用了它”,不看定义在哪、嵌套多深,也不看上层对象有没有相关属性。
隐式绑定的核心规则
只要写法是 obj.method() 或 obj.inner.method() 这类“对象点函数再加括号”的形式,this 就指向点号左边那个直接发起调用的对象。
-
obj.method()→this是obj -
obj.inner.say()→this是obj.inner(不是obj,也不是全局) -
obj.a.b.c.fn()→this是obj.a.b.c(只取最后一层对象)
常见误解:嵌套结构 ≠ 多层 this 绑定
很多人以为 obj.inner.say() 中的 say 能自动访问 obj,其实不能。隐式绑定不“穿透”,它只认调用那一刻的直接宿主。
- 即使
inner是obj的属性,say内部的this.name也只会找obj.inner.name - 如果
obj.inner没有name,而obj有,this.name依然为undefined
隐式绑定容易丢失的几种情况
一旦脱离“对象.方法()”这个调用形式,隐式绑定就失效,this 会退回到默认绑定(非严格模式下是 window,严格模式下是 undefined)。
- 赋值后调用:
const fn = obj.inner.say; fn(); - 作为回调传入:
setTimeout(obj.inner.say, 100); - 被高阶函数执行:
someUtil(obj.inner.say);
怎么验证当前 this 指向?
最简单的方法是在函数内部加一句 console.log(this),然后观察输出对象的结构和属性。
- 如果输出的是你预期的那个对象(比如
{ name: 'inner' }),说明隐式绑定生效了 - 如果输出
Window、global或undefined,说明已经丢失绑定











