默认绑定规则本身不随环境变化,但结果因全局对象差异而不同:浏览器中指向window,node.js commonjs中指向module.exports,esm中顶层this恒为undefined。

JavaScript 中的默认绑定(Default Binding)指函数以普通方式调用(如 foo())且未显式绑定 this 时,this 的指向规则。它本身不随环境变化,但“默认绑定到谁”取决于当前执行上下文的全局对象——而浏览器和 Node.js 的全局对象不同,导致结果差异明显。
浏览器环境:this 默认指向 window
在非严格模式下,顶层代码或独立函数调用触发默认绑定时,this 指向 window 对象:
-
console.log(this === window)返回true -
var x = 1等价于window.x = 1,变量挂载到window - 事件回调中若未手动绑定(如
btn.addEventListener('click', handler)),handler内部的this通常也是window(除非是箭头函数或显式绑定)
Node.js CommonJS 环境:this 默认指向 module.exports
Node.js 将每个文件视为一个模块,顶层 this 不等于全局对象 global,而是直接指向当前模块的导出对象:
-
console.log(this === module.exports)返回true -
console.log(this === global)返回false - 函数内普通调用(
foo())仍走默认绑定:非严格模式下this是global;严格模式下为undefined
ES 模块(ESM)环境:顶层 this 恒为 undefined
无论浏览器还是 Node.js,只要使用 import/export 的 ESM 模块,顶层作用域自动启用严格模式:
-
console.log(this)在 ESM 文件顶层输出undefined - 函数内普通调用也遵循严格模式:
this为undefined,不会退回到任何全局对象 - 这是 ESM 与 CommonJS 的关键区别之一——CommonJS 顶层
this === exports,ESM 则禁止依赖或赋值顶层this
判断运行环境的小技巧
可通过检查全局对象是否存在来粗略区分环境(注意不能仅靠 window,因某些 Node 工具可能模拟):
-
typeof window !== 'undefined'→ 大概率是浏览器 -
typeof global !== 'undefined' && typeof window === 'undefined'→ 大概率是 Node.js - 更可靠的方式是检测模块系统:
module?.exports存在且exports可写 → CommonJS;import.meta?.url存在 → ESM
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











