隐式丢失导致this指向全局(非严格模式下为window,严格模式下为undefined),根本原因是函数被赋值或传参后脱离对象上下文,调用时变为独立调用,触发默认绑定规则;常见场景包括变量赋值、回调传入、解构获取、数组方法使用及事件监听器直接赋值。

隐式丢失导致 this 指向全局(非严格模式下是 window,严格模式下是 undefined),根本原因在于函数调用时脱离了对象上下文,触发了默认绑定规则。
为什么一赋值就丢掉 this?
当写 const fn = obj.method 时,只是把函数引用复制给了 fn,并没有保留它和 obj 的关系。后续调用 fn() 就等价于独立函数调用,JavaScript 引擎找不到任何对象前缀,于是按默认规则处理:
- 非严格模式 →
this绑定到全局对象(window) - 严格模式 →
this为undefined
哪些操作会引发隐式丢失?
不只是简单赋值,任何让方法“脱离对象调用形式”的场景都会触发:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 作为回调传入:例如
setTimeout(obj.handleClick, 100) - 解构获取方法:
const { handleClick } = obj,再调用handleClick() - 数组方法中使用:
[1,2,3].map(obj.process) - 事件监听器直接传方法:
button.onclick = obj.onClick
为什么 console.log(this) 有时显示 window,有时报错?
这取决于是否启用严格模式:
立即学习“Java免费学习笔记(深入)”;
- 没写
'use strict':访问this.a实际是访问window.a,如果window上没有该属性,就得到undefined - 写了
'use strict':this是undefined,再访问this.a就会抛出Cannot read property 'a' of undefined
关键不是“this 被改了”,而是“没被绑定”
隐式丢失的本质不是 this 被错误地设成了 window,而是函数根本没有进入隐式绑定流程——它压根没被当作对象方法来调用。所以解决方向不是“修复 this”,而是确保函数执行时有明确的归属对象。

















