几种声明全局变量的方式的不同以及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);
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);
相关文章推荐
- oc中,对象声明成员变量的几种方式,以及对应的一些扩展知识
- 声明string变量的几种方式区别
- 基于JavaScript 声明全局变量的三种方式详解
- 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法
- javascript 没有块级作用域 JavaScript声明全局变量三种方式 及
- JavaScript中声明全局变量三种方式的异同
- JavaScript声明全局变量三种方式的异同
- 探讨JavaScript中声明全局变量三种方式的异同
- JavaScript声明全局变量三种方式的异同
- 基于JavaScript的三种声明全局变量方式介绍
- OC中声明变量的几种方式
- 不同包里的全局变量定义方式及系统配置处理
- 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法!
- JavaScript声明全局变量的三种方式
- JavaScript基础(基本语法:变量、语句、数组、函数、对象、全局方法以及js与java不同,js与html关联)
- 内存分配方式(动态/静态)的不同对const变量(全局/局部)访问性的影响
- JavaScript声明全局变量三种方式的异同javascript
- 全局变量的声明和定义 以及dll中全局变量的导出
- 不写var的全局变量声明方式的一个副作用(Side Effects When Forgetting var)
- JavaScript声明全局变量三种方式的异同