普通函数调用时this默认指向全局对象(非严格模式)或undefined(严格模式),易导致上下文丢失;应通过箭头函数、bind或类字段语法主动绑定this。

在普通函数调用中,this 的默认指向取决于是否启用严格模式:
非严格模式下指向全局对象
直接调用函数(如 foo()),不通过对象属性、new、call/apply/bind 或箭头函数等方式调用时:
- 浏览器环境中,this 指向
window对象 - Node.js 环境中,this 指向
global对象 - ESM 模块顶层代码虽无显式
"use strict",但默认按严格模式运行,此时 this 为undefined
严格模式下为 undefined
只要函数体或所在作用域启用了严格模式(例如开头写 "use strict"):
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- this 不再回退到全局对象
- 普通调用时直接是
undefined - 这能提前暴露未绑定上下文的问题,比如
obj.method被赋值后单独调用
为什么容易出错
这类调用看似简单,却常因上下文丢失引发问题:
立即学习“Java免费学习笔记(深入)”;
-
setTimeout(obj.method, 100)→ this 不再是obj -
button.addEventListener('click', obj.handleClick)→ 回调中 this 指向按钮元素,不是obj - 解构赋值:
const { say } = obj; say();→ 同样退化为普通调用
如何避免默认绑定带来的意外
关键不是“改默认”,而是主动控制调用方式:
- 用箭头函数包装:
() => obj.method() - 提前绑定:
obj.method.bind(obj) - 类中使用字段语法(现代写法):
handleClick = () => { ... } - 传入时立即绑定:
addEventListener('click', this.handleClick.bind(this))

















