BOM
ECMAScript是JavaScript的核心,但如果要在Web中使用JavaScript,那么BOM(浏览器对象模型)则无疑才是真正的核心。BOM提供了很多对象,用于访问浏览器的功能,这些功能与任何网页内容无关。多年来,缺少事实上的规范导致BOM既有意思又有问题,因为浏览器提供商会按照各自的想法随意去扩展它。于是,浏览器之间共有的对象就成为了事实上的标准。这些对象在浏览器中得以存在,很大程度上是由于它们提供了与浏览器的互操作性。W3C为了把浏览器中JavaScript最基本的部分标准化,已经把BOM的主要方便纳入了HTML5的规范中。
window对象
BOM的核心对象是window,它表示浏览器的一个实例。在浏览器中,window对象有双重角色,它既是通过JavaScript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象。这意味着在网页中定义的任何一个对象、变量和函数,都以window作为其Global对象。
全局作用域
由于window对象同时扮演着ECMAScript中Global对象的角色,因此所有在全局作用域中生命的变量、函数都会变成window对象的属性和方法。如下:
var age = 29; function sayAge(){ console.log(this.age); } console.log(window.age); //29 sayAge(); //29 window.sayAge(); //29
抛开全局变量会成为window对象的属性不谈,定义全局变量与在window对象上直接定义属性还是有一点差别:全局变量不能通过delete操作符删除,而直接在window对象上的定义的属性则可以。如下:
var age = 29; window.color = "red"; delete age; delete window.color; console.log(age); //29 console.log(window.color); //undefined
尝试访问未声明的变量会抛出错误,但是通过查询window对象,可以知道某个可能未声明的变量是否存在。如下:
var newValue = oldValue; //ReferenceError: oldValue is not defined var newValue = window.oldValue;