在浏览器环境中,有多个变量或属性指向全局的 window 对象。根据层级关系和使用场景,主要分为以下几类:
1. 核心指向变量
这些变量在大多数情况下直接等同于 window,但语义和规范有所不同:
window: 最常用的引用,指向当前浏览器窗口对象。self: 指向当前窗口本身,等同于window。它在 Web Workers 中非常有用,因为 Worker 中没有window变量,但有self指向全局作用域。globalThis: ES2020 引入的标准属性,旨在提供一种跨平台(浏览器、Node.js 等)访问全局对象的方法。this: 在全局执行上下文中(非函数内部或非严格模式下),this关键字也指向window。
2. 窗口层级指向变量
这些变量在处理 iframe 或多窗口嵌套时具有特定含义:
top: 指向最顶层的窗口。如果页面被嵌入在多层iframe中,top始终指向最外层的浏览器窗口。parent: 指向当前窗口的直接父级窗口。如果没有父级,则等于window。opener: 指向打开当前窗口的那个窗口(通常是通过window.open打开的)。如果窗口不是由其他窗口打开的,则为null。
3. 主要区别汇总
| 变量 | 区别与特点 | 适用场景 |
|---|---|---|
window | 浏览器标准的全局引用,代表整个 BOM 核心。 | 普通网页开发。 |
self | 通用性强,可读性好,支持 Web Workers。 | 需要兼容 Worker 环境的代码。 |
top | 始终指向最高层级,不受 iframe 嵌套影响。 | 想要“跳出” iframe 框架时使用。 |
parent | 仅指向上一级。 | 处理嵌套的 iframe 通信。 |
globalThis | 现代标准,统一了不同环境下的全局变量名。 | 编写跨平台(Node/Browser)库。 |
4. 特殊行为提示
- 全局污染: 使用
var声明的全局变量会自动成为window的属性(如var a = 1等价于window.a = 1),但let和const声明的变量不会挂载到window上。 - 自引用:
window对象具有递归性,window.window.window === window永远为真。