在ES5 中,顶层对象的“本身”在各种实现里面是不统一的。比如:
浏览器里面,顶层对象是window,但 Node 和 Web Worker 没有window。
大家都知道JavaScript 语言采用的是单线程模型,Web Worker 就是用来为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。除了window对象,Web Worker线程也无法使用document、parent这些对象。但是,Worker 线程可以使用navigator对象和location对象。
更多Web Worker知识可参考:Web Worker 使用教程浏览器和 Web Worker 里面,self也指向顶层对象,但是 Node 没有self。
我们在打开任何一个网页时,浏览器都会创建一个窗口,这个窗口就是一个window对象,也是我们在js里说的全局对象或全局作用域对象。self 也是指窗口本身,它返回的对象跟window对象是一样的,也就是当前 window 对象的引用,但是self 属性是只读的。self语法可以self或者window.self,所以window、self、window.self 是等价的:
self === window // true self === window.self // true self.window === self // true self === window.self.self // true self