浏览器对象模型(BOM)的核心对象是window,表示的是一个浏览器的实例。window对象即是访问浏览器的一个接口,也是规定的一个全局对象。在全局作用域中声明的任何一个变量,函数都会成为window对象的属性和方法。
如上,定义在全局中的变量age和全局中的函数say(),其实都是在window对象下面的,我们都可以通过window对其进行访问。
定义在全局中的属性和直接挂载在window上面还是有一定的区别。挂载在window上面的属性可以通过delete操作符进行删除,而直接定义在全局中的变量是无法通过delete操作符进行删除的。这是因为在全局中声明的属性其属性特性中有[[Configurable]]特性,其值为false所以这样的值是无法通过delete操作符进行删除掉的。
还有一个要注意的是,直接访问未声明的变量是会报错的,如果通过window访问没有声明的变量会返回undefined,但是不会进行报错。如下:
如果页面中包含框架,则每个框架都含有自己的window对象,并且保存在frames集合中。在frames集合中我们可以通过索引进行访问,或者通过框架名称访问相应的window对象。每个window对象都有一个name属性,name属性的值就是框架的名称。
看下如上结构,上述代码中创建了一个框架集,其中一个框架居上,两个框架居下。我们可以通过window.frames[0]或者window.frames['topFram']来对上方的框架集引用,我们还可以通过top来进行引用,例如top.frames[0]或者top.frames['topFram']。
top是始终指向的最外层的框架,也就是浏览器窗口对象(window)。但是有的时候却不是这样,因为在一个框架中,其中的window指向的是那个框架的特定实例。而不是最外层的框架。所以使用top可以确保在一个框架中能够访问到另外一个框架。
和top相对应的是另外一个window对象是parent对象,parent 对象始终指向的是当前框架的直接上层框架,所以在某些情况下top和parent的指向是相等的,在没有框架的情况下top和parent是相等的,都等于window。
和框架有关的还有一个对象是self对象,它始终指向的是window对象。top,parent,self都是window对象的属性。