window.self 是 window 的同义词,等价于 window、self 和 window.window;在 service worker 或 web worker 中 self 仍可用,而 window 不可用;它无安全特权,仅具语义与兼容价值。

在全局执行上下文中,window.self 没有特殊含义——它就是对当前窗口对象的直接、冗余引用,等价于 window 本身。
window.self 就是 window 的同义词
在浏览器主线程的全局作用域中,以下四者严格相等:
windowwindow.selfselfwindow.window
这种等价性不是巧合,而是规范定义的结果:window.self 是只读属性,返回当前 Window 对象的引用。它不改变行为、不触发副作用,也不提供额外能力。
唯一实用价值:语义清晰与上下文兼容
虽然功能上和 window 完全一致,但 self(不含 window. 前缀)在两类场景中不可替代:
-
跨上下文通用写法:在 Service Worker 或 Web Worker 脚本中,
window不存在,但self仍可访问全局作用域(此时指向ServiceWorkerGlobalScope或WorkerGlobalScope) -
iframe 嵌套中的可读判断:用
parent === self比parent === window更直观地表达“我是不是父页面”;用top === self明确检查“我是否为顶层窗口”
常见误用提醒
有人以为 window.self 能绕过某些安全限制或获得特殊权限,这是误解:
- 它不能访问被同源策略隔离的父/子 iframe 内容
- 它不能替代
window.open()或window.close()等方法调用 -
window.self.location和window.location行为完全相同,无差异
本质上,window.self 是一个设计上为未来扩展留出的兼容性锚点——今天它很平凡,但正是这种平凡,让它能在 worker 环境中自然延续为真正的全局标识符。











