ES6类内部自动启用严格模式,this始终为undefined而非全局对象;脱离上下文调用时this丢失,可通过console.log(this)验证,预防方式包括构造函数绑定、箭头函数定义或手动bind。

类方法内部的 this 始终按严格模式行为运行,无需显式写 "use strict" —— 这是 ES6 类的默认规则。
类代码天然处于严格模式
所有 class 的内部(包括构造函数、普通方法、getter/setter、静态方法)都自动启用严格模式。这意味着:
- 直接调用类方法(如解构后调用)时,this 为 undefined,不会退化到全局对象
- 不允许使用
with或八进制字面量等非严格语法 - 对只读属性赋值、删除不可配置属性等操作会抛出错误,而非静默失败
识别 this 是否丢失的典型信号
当类方法被“脱离对象上下文”调用时,this 就会变成 undefined,这是严格模式最直接的表现:
-
const fn = obj.method; fn();→ 控制台打印this是undefined - 作为事件处理器传入:
button.addEventListener('click', obj.handleClick);→ 点击时this不再是obj - 在回调中使用:
setTimeout(obj.process, 100);→process内部this为undefined
验证当前 this 指向的简单办法
在类方法开头加一句判断,快速确认是否还在预期上下文中:
if (this === undefined) console.warn('this context lost!');console.assert(this instanceof MyClass, 'this must be an instance');- 或直接
console.log(this);—— 如果输出undefined,说明已脱离实例上下文
不依赖运行时检测的预防方式
从写法上避免 this 丢失,比事后识别更可靠:
- 在构造函数中绑定:
this.handleClick = this.handleClick.bind(this); - 用箭头函数定义方法(作为类字段):
handleClick = () => { console.log(this); }; - 调用时手动绑定:
obj.addEventListener('click', obj.method.bind(obj));

















