浏览器控制台和普通script中this默认指向window(非严格模式)或undefined(严格模式),node.js repl中指向globalthis,es模块和严格模式下this不绑定全局对象。

在不同 JavaScript 运行环境中,this 的指向差异很大,容易混淆。关键不是死记硬背,而是理解每个环境的执行上下文和默认绑定规则。
浏览器控制台中的 this 指向 window(非严格模式)
开发者工具控制台本质上是全局作用域的延伸。直接输入代码时,没有显式调用者,this 默认绑定到全局对象:
- 非严格模式下:
this === window为 true - 严格模式下(如输入
"use strict"; this):this是 undefined - 注意:控制台中函数内部的
this仍遵循常规规则(如普通调用 → window / undefined,箭头函数 → 外层 this)
<script> 标签里的 this 默认也指向 window(非严格模式)</script>
HTML 中内联或外链的 script 脚本,在全局作用域执行,行为与控制台一致:
-
<script>console.log(this === window);</script>输出 true - 但若 script 被包裹在 IIFE 或模块(
type="module")中,情况不同:模块顶层的this始终为 undefined -
type="module"下脚本默认启用严格模式,且顶层this不绑定全局对象
Node.js REPL 中的 this 指向 globalThis(而非 global)
Node REPL 的顶层 this 是一个特殊对象,它等价于 globalThis,但不完全等于 global:
-
this === globalThis→ true;this === global→ true(当前 Node 版本中二者同源) - 但
this在 REPL 中可被重新赋值(如this = 123),而global是只读引用(不能被覆盖) - 函数内普通调用的
this在非严格模式下仍为globalThis,严格模式下为 undefined
对比总结:核心差异在于“全局对象”的定义和是否启用严格模式
三者都处于“全局执行上下文”,但宿主环境定义了不同的全局对象和默认绑定策略:
- 浏览器控制台 & 普通 script:全局对象是
window(DOM 环境),this默认绑定它(非严格) - Node REPL:全局对象是
globalThis(即global),this默认绑定它(非严格) - ES 模块(
type="module"或 Node 的 .mjs)、严格模式、箭头函数:切断默认绑定,this不自动指向全局











