javascript中全局作用域的this指向随环境和严格模式变化:浏览器非严格模式指向window,严格模式为undefined;node.js模块中指向module.exports,应统一用globalthis替代this访问全局对象。

在 JavaScript 中,全局作用域下的 this 指向取决于运行环境和代码模式(严格模式与否),它不是“固定不变”的,而是由调用上下文决定的——只不过在顶层非函数代码中,它的绑定规则看起来像是“默认”的。理解它,关键在于分清环境与模式。
浏览器环境中的全局 this
在浏览器中,非严格模式下,脚本顶层的 this 指向 window 对象(即全局对象):
这意味着你可以通过 this 读写全局变量或函数(等价于直接操作 window):
console.log(window.name); // 'Alice'
但注意:这仅适用于非严格模式;严格模式下,顶层 this 是 undefined。
严格模式下 this 不再自动绑定到全局对象
在严格模式(如使用 "use strict" 或模块文件中),顶层 this 不再是 window:
console.log(this); // undefined
此时试图通过 this 设置属性会静默失败(不报错但无效),也无法访问全局变量:
-
this.foo = 123不会创建全局变量foo -
console.log(this.document)会报错(Cannot read property 'document' of undefined)
Node.js 环境中的全局 this
Node.js 的模块是包装在函数中的(CommonJS),所以顶层代码实际处于函数作用域内。因此:
- 非严格模式下,模块顶层的
this指向module.exports(不是global) -
globalThis才是 Node.js 中真正的全局对象(兼容浏览器的跨环境标准) - 想访问全局对象,应优先用
globalThis,而不是依赖this
console.log(globalThis === global); // true(Node.js)
为什么不该依赖默认的全局 this 绑定
这种绑定既脆弱又易混淆:
- 同一段代码在严格/非严格、浏览器/Node.js、模块/脚本中行为不同
- ES6 模块自动启用严格模式,
this在顶层始终为undefined - 现代开发普遍使用模块化,直接靠
this访问全局几乎不可靠
推荐做法:
— 需要全局对象时,显式使用 globalThis(ES2020+,全环境支持)
— 需要挂载全局变量,直接赋值给 globalThis.xxx 或 window.xxx(加判断)
— 避免在顶层用 this 做逻辑判断或赋值
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











