三种方式声明全局变量:
strX;
var strX;
window.strX;
区别:
(1)通过strX和window.strX添加的全局变量都可以通过delete删除,但是通过var声明的全局变量,不能通过delete删除.
(2)当把document.expando=false;之后,就不能通过window.strX添加全局变量,但是仍然可以通过strX或者var strX添加全局变量。
(3)在低版本的ie浏览器中,前两种声明方式(A类)和后一种声明方式(B类),在某些情况下,有很大的区别,分四个阶段分别叙述一下区别 (参考资料地址:http://hax.iteye.com/blog/349569):
定义阶段:A类定义方式,是基于JS引擎的全局变量机制添加的。B类定义方式,是基于DOM的expando机制添加的。后者相当于在window对象上定义了一个strX属性,该属性指向一个全局中的一个值。
取值阶段:通过非window方式的取值,查找全局变量中是否存在这样一个变量,通过window对象取值时,如果全局中存在这样一个变量,就绑定window.strX到strX,通过这个绑定引用来进行存取操作。
赋值阶段:通过非window方式进行赋值,相当于直接对全局中的引用进行赋值,而通过window方式,相当于对这个window的属性的引用的值进行了修改。
删除阶段:在低版的ie中,有一个bug,就是删除全局中的引用,会造成window的属性的引用丢失,抛出“out of memory ”错误。在其他的浏览器中,删除任何一个全局中的对象,都会通知window中属性进行相应的更改。例如以下代码:
x={};//在全局中定义了一个变量x。
window.x;//访问了window x,将全局的x绑定到window的x属性上,
delete x;//单方向的删除了全局中的x,但是window对象不知道,所以window的x属性的引用丢失,所以下面的alert x会报out of memeory。当然这只是在低版本的ie中,如果在其他浏览器中,会报referenceType错误
alert(x);