隐式绑定的 this 指向调用时点号左边的对象;如 obj.method() 中 this 为 obj,obj.nested.deepFn() 中 this 为 nested,关键在调用位置而非声明位置或嵌套层级。

隐式绑定的 this 指向哪个对象?
隐式绑定中,this 指向的是「调用该函数时,点号(.)左边的那个对象」——不是定义时所在的对象,也不是上层作用域对象,就是执行时紧挨着函数名的那个对象。
比如 obj.method(),this 就是 obj;而 obj.nested.deepFn(),this 是 deepFn 所属的 nested 对象,不是 obj,也不是 deepFn 的闭包环境。
关键在于「调用位置」,而非「声明位置」或「嵌套层级」。
为什么赋值后调用会丢失 this?
把一个带 this 的方法赋给变量再调用,就破坏了隐式绑定的触发条件:点号左侧没了对象。
-
const fn = obj.method;→fn()是独立调用,this在非严格模式下为window(或globalThis),严格模式下为undefined -
setTimeout(obj.method, 100)同理,传入的是函数引用,调用时没有点号上下文 - 解构也会触发:
const { method } = obj; method();→this丢失
这不是“this 被改变了”,而是根本没触发隐式绑定——连绑定的机会都没有。
如何验证当前 this 是否符合隐式绑定预期?
最直接的办法是在函数内部打日志或断点,检查 this 值是否等于你认为的“点号左边对象”:
const obj = {
name: 'alice',
say() {
console.log(this === obj); // true ✅
console.log(this.name); // 'alice'
}
};
obj.say(); // true + 'alice'
注意几个典型反例:
-
const s = obj.say; s();→this === obj是false -
(obj.say)();→ 圆括号不改变调用方式,仍是独立调用,this丢失 -
obj.say.call(null);→ 显式绑定优先级更高,覆盖隐式绑定
隐式绑定和箭头函数混用时的坑
箭头函数没有自己的 this,它会沿作用域链向上找外层普通函数的 this。一旦外层函数不是通过隐式绑定调用的,整个链就失效了。
例如:
const obj = {
name: 'bob',
regular() {
return () => {
console.log(this.name); // 这里的 this 是 regular 调用时的 this,即 obj
};
}
};
const arrow = obj.regular();
arrow(); // 'bob' ✅
但如果你把 regular 先取出来再调用:
-
const r = obj.regular; r()();→ 外层regular的this已经不是obj,内层箭头函数捕获的就是错误的this - 此时
this.name通常是undefined(严格模式)或报错(访问window.name)
隐式绑定本身不难理解,真正容易出问题的地方,永远在「你以为有隐式绑定,其实已经断开了」的那一瞬间。

















