隐式绑定由函数调用方式决定,即obj.method()或obj['method']()时this指向obj;若调用脱离对象(如赋值后调用、传入回调),则触发默认绑定,this不再指向原对象。

隐式绑定发生在函数作为对象的属性被“点调用”或“方括号调用”时,JavaScript 引擎会自动把 this 绑定到该对象上。它不是靠函数定义位置决定的,而是由函数**怎么被调用**决定的——只要调用形式是 obj.method() 或 obj['method'](),引擎就识别出这是“方法调用”,从而把 this 设为 obj。
隐式绑定发生的条件
必须同时满足两个关键点:
- 函数必须是对象的一个属性值(即作为方法存在)
- 调用时必须通过该对象直接发起,比如
obj.fn()、obj['fn'](),不能中间断开
为什么 this 会变?本质是调用方式变了
this 的指向不取决于函数写在哪,而取决于它“被谁调用”。同一个函数,调用方式不同,this 就不同:
-
user.getName()→ this 指向user(隐式绑定生效) -
const fn = user.getName; fn()→ 调用变成独立函数调用,this 回退到默认绑定(非严格模式下是window,严格模式下是undefined) -
setTimeout(user.getName, 100)→getName被传作回调,脱离了user,同样触发默认绑定
嵌套对象里 this 指向哪?只看最后一层
多层对象访问时,this 只认“真正执行函数的那个对象”:
-
obj.a.b.method()中,this 指向b,不是a或obj - 因为只有
b.method()是实际触发调用的位置,前面的obj.a.只是路径查找,不参与 this 绑定
常见“隐式丢失”场景及应对
这些情况看似在用对象方法,实则破坏了隐式绑定:
- 赋值给变量:
const handler = btn.onclick; handler() - 传入回调:
addEventListener('click', obj.handleClick) - 解构后调用:
const { handleClick } = obj; handleClick()
解决办法:用 bind、箭头函数、或事件监听时用 obj.handleClick.bind(obj) / e => obj.handleClick(e) 显式锁定 this。

















