开头
终于在好几个礼拜之后,又回到了对js的学习,过几天有时间会写一些这段失踪的时间做微信小程序的一些体会。
Window对象
BOM的核心就是window,它具有着双重身份,既是JS访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象。这就意味着我们在网页中定义的任何一个对象、变量、函数,都会以window作为其Global对象,因此有权限来访问parse Int()等方法。
全局作用域
由于window对象有双重身份的特点,所以在全局作用域中声明的变量、函数都会变成window对象的属性和方法。
var age = 29;
function sayAge(){
alert(this.age);
}
alert(window.age); //结果为29
sayAge(); //结果为29
window.sayAge(); //结果为29
这段代码中,我们在全局作用域中定义了一个age变量和一个sayAge函数,他们自定被归在了window
对象名下,于是我们就可以通过window.+对象/函数名来调用和访问他们。由于sayAge是存于全局作用域中的,所以this.age被映射到window.age,最后的结果仍是正确的。
如果不谈全局变量会归于window名下这一点,定义全局变量与在window对象上直接定义属性还是存在一点区别的,全局变量不能通过delete来删除,而直接在window对象上的定义的属性可以。
像这样:
var age = 29;
window .color = "red";
delete window.age;
delete window.color;
alert(window.age); //结果为29
alert(window.color); //undefined
注意:IE8以及更早版本在遇到使用delete删除window属性的语句时,不管该属性最开始是如何创建的,都会报错,IE9以及以上版本才不会。
另外,还要记住,尝试访问没有声明过的变量会报错,但是通过查询window对象,可以知道某个可能未声明变量是否存在,例如:
var newValue = oldValue; //这里会报错,因为oldValue未定义
var newValue = window.oldValue; //这里不会报错,因为这是一次属性查询,oldValue的值是undefined