您的位置:首页 > 其它

几种声明全局变量的方式的不同以及ie中的变量人格分裂

2014-08-11 18:50 399 查看
三种方式声明全局变量:

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: