由于window对象同时扮演着ECMAScript中Global对象的角色,因此所有在全局作用域中声明的变量、函数都会变成window对象的属性和方法,如下:
1 var age = 29; 2 function sayAge ( ){ 3 alert ( this.age ); 4 } 5 alert( window.age); //29 6 sayAge(); // 29 7 window.sayAge( ); //29
我们在全局作用域中定义了一个变量age和一个函数sayAge ( ),它们被自动归在了window对象名下。
由于sayAge( )存在于全局作用域中,因此this.age被映射到window.age, 最终显示的仍然是正确的结果。
抛开全局变量会成为window对象的属性不谈, 定义全局变量与在window对象上直接定义属性还是有一点差别:全局变量不能通过delete操作符删除,而直接在window对象上的定义的属性可以。如下:
1 var age = 29; 2 window.color = ‘red’; 3 //在 IE < 9时抛出错误,在其他所有浏览器中都返回false 4 delete window.age; 5 //在 IE < 9时抛出错误,在其他所有浏览器中都返回true 6 delete window.color; 7 8 alert(window.age)// 29 9 alert( window.color) //undefined
刚才使用var 语句添加的window属性有一个名为[ [ Configurable ] ]的特性,这个特性的值别设置为false,因此这样定义的属性不可以通过delete操作符删除,IE8及更早版本在遇到使用delete删除 window属性的语句时,不管该属性最初是如何创建的,都会抛出错误,以示警告。IE9及更高版本不会抛出错误。
备注:
文章节选自《Javascript 高级程序设计》
时间: 2024-11-08 09:01:10