BOM 的核心是 window 对象,表示浏览器的实例。 window 对象在浏览器中有两重身份,一个是 ECMAScript中的 Global 对象,另一个就是浏览器窗口的JavaScript API接口,里面包含了当前客户端浏览器的一些信息,和常用的一些浏览器操作。这意味着网页中定义的所有对 象、变量和函数都以 window 作为其 Global 对象,都可以访问其上定义的 parseInt() 等全局方 法。

浏览器里面,window对象(注意,w为小写)指当前的浏览器窗口。它也是当前页面的顶层对象,即最高一层的对象,所有其他对象都是它的下属。一个变量如果未声明,那么默认就是顶层对象的属性。

Global 作用域

因为 window 对象被复用为ECMAScript的 Global 对象,所以通过 var 声明的所有全局变量和函 数都会变成 window 对象的属性和方法。

  1. var age = 29;
  2. var sayAge = () => alert(this.age);
  3. alert(window.age); // 29
  4. sayAge(); // 29
  5. window.sayAge(); // 29

这里,变量 age 和函数 sayAge() 被定义在全局作用域中,它们自动成为了 window 对象的成 员。因此,变量 age 可以通过 window.age 来访问,而函数 sayAge() 也可以通过 window.sayAge() 来访问。因为 sayAge() 存在于全局作用域, this.age 映射到 window.age ,所以就可以显示正确的结果了。 如果在这里使用 let 或 const 替代 var ,则不会把变量添加给全局对象。

window 对象的属性

window.name

window.name属性是一个字符串,表示当前浏览器窗口的名字。窗口不一定需要名字,这个属性主要配合超链接和表单的target属性使用。

  1. window.name = 'Hello World!';
  2. console.log(window.name)
  3. // "Hello World!"

该属性只能保存字符串,如果写入的值不是字符串,会自动转成字符串。各个浏览器对这个值的储存容量有所不同,但是一般来说,可以高达几MB。
只要浏览器窗口不关闭,这个属性是不会消失的。举例来说,访问a.com时,该页面的脚本设置了window.name,接下来在同一个窗口里面载入了b.com,新页面的脚本可以读到上一个网页设置的window.name。页面刷新也是这种情况。一旦浏览器窗口关闭后,该属性保存的值就会消失,因为这时窗口已经不存在了。

window.closed window.opener

window.closed 属性返回一个布尔值,表示窗口是否关闭。

  1. window.closed // false

上面代码检查当前窗口是否关闭。这种检查意义不大,因为只要能运行代码,当前窗口肯定没有关闭。这个属性一般用来检查,使用脚本打开的新窗口是否关闭。

  1. var popup = window.open();
  2. if ((popup !== null) && !popup.closed) {
  3. // 窗口仍然打开着
  4. }

window.opener属性表示打开当前窗口的父窗口。如果当前窗口没有父窗口(即直接在地址栏输入打开),则返回null。

  1. window.open().opener === window // true

上面表达式会打开一个新窗口,然后返回true。
如果两个窗口之间不需要通信,建议将子窗口的opener属性显式设为null,这样可以减少一些安全隐患。

  1. var newWin = window.open('example.html', 'newWindow', 'height=400,width=400');
  2. newWin.opener = null;

上面代码中,子窗口的opener属性设为null,两个窗口之间就没办法再联系了。

通过opener属性,可以获得父窗口的全局属性和方法,但只限于两个窗口同源的情况,且其中一个窗口由另一个打开。元素添加rel=”noopener”属性,可以防止新打开的窗口获取父窗口,减轻被恶意网站修改父窗口 URL 的风险。

  1. <a href="https://an.evil.site" target="_blank" rel="noopener">
  2. 恶意网站
  3. </a>

窗口本身 window.self window.window

window.self和window.window属性都指向窗口本身。这两个属性只读。

  1. window.self === window // true
  2. window.window === window // true

框架窗口 window.frames,window.length

window.frames属性返回一个类似数组的对象,成员为页面内所有框架窗口,包括frame元素和iframe元素。window.frames[0]表示页面中第一个框架窗口。

如果iframe元素设置了id或name属性,那么就可以用属性值,引用这个iframe窗口。比如