浏览器中有多少指向 window 的变量,什么区别

14 阅读2分钟

在浏览器环境中,有多个变量或属性指向全局的 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 永远为真。