javascript 中 this 的默认绑定发生在函数独立调用时,非严格模式下指向全局对象(浏览器为 window,node.js 为 global),严格模式及 es 模块中为 undefined;应避免依赖默认绑定,推荐显式绑定、箭头函数或严格模式。

在 JavaScript 中,this 的默认绑定发生在函数独立调用(即不作为对象方法、不通过 call/apply/bind、也不在箭头函数或类方法中)时。此时 this 指向全局对象,但严格模式下为 undefined。
非严格模式下的默认绑定:指向全局对象
在浏览器环境中,全局对象是 window;在 Node.js 中则是 global。只要函数是“裸调用”,this 就会回退到该全局对象。
function foo() { console.log(this === window); } foo(); // true(浏览器)- 即使函数定义在对象内部,只要调用时脱离上下文,仍触发默认绑定:
const obj = { bar: function() { return this; } }; const fn = obj.bar; fn(); // this 指向 window(非严格)
严格模式彻底切断默认绑定
启用 "use strict" 后,独立调用的函数中 this 不再自动绑定到全局对象,而是保持为 undefined,避免隐式错误。
"use strict"; function foo() { console.log(this); } foo(); // undefined- 模块脚本(ESM)默认处于严格模式,因此 this 在顶层函数中始终为
undefined,不会意外指向window或global
全局作用域中的 this 并非总是全局对象
在全局作用域(非函数内)直接使用 this,其值取决于执行环境和是否严格模式:
- 浏览器普通脚本:顶层
this指向window - Node.js 普通脚本:顶层
this指向当前模块的exports(不是global),而globalThis才是真正的全局对象 - ES 模块(.mjs 或
type="module"):顶层this是undefined(因默认严格模式)
现代开发中应主动规避默认绑定
依赖默认绑定容易引发难以追踪的 bug,尤其在回调、事件处理器或解构赋值后调用函数时。推荐做法:
- 显式绑定:
fn.call(obj, ...args)或使用bind - 用箭头函数捕获外层 this(因其不绑定自己的 this)
- 在类方法中使用 class 字段语法 + 箭头函数(如
handler = () => { ... })防止丢失上下文 - 开启严格模式或使用 TypeScript / ESLint 规则(如
no-invalid-this)提前预警
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











