当前位置:天尊娱乐 > 客户案例 >

浅析JavaScript中两种类型的全局对象/函数

作者:与薄雾 发布时间:2019-03-09 12:12
  
NaN = 11;  
eval = 22;  
Object = 33;  
Math = 44;  
  
alert(NaN);  
alert(eval);  
alert(Object);  
alert(Math);
  
  
分别取值属性的全局对象, 函数属性的全局对象,构造器(类)属性的全局对象,其它属性的全局对象NaN,eval,Object,Math。结果如下  

  

结果可以看出除了NaN在IE9(pre3)/Safari不能被重写外,其它都被重写了。这里只是列举了四个,感兴趣的可以将以上所有的The Global Object一一测试下。这里想表达的是核心JavaScript内置对象一般是可以被重写的 ,虽然没人这么干。

  

  

下面测试下其可枚举性  
代码如下:

  
for(var a in NaN){  
alert(a);  
}  
for(var a in eval){  
alert(a);  
}  
for(var a in Object){  
alert(a);  
}  
for(var a in Math){  
alert(a);  
}  
  
所有浏览器都没有弹出,即属性不被枚举。感兴趣的可以将以上所有的The Global Object的枚举性一一测试下。当然对于有些浏览器如Firefox,某些Global Object被重写后又是可以被枚举的。

  

  

二、宿主环境提供的全局对象/函数   

  

如window,alert,setTimeout,document,location等,多数浏览器都会限制其重写  
代码如下:

  
window = 55;  
alert(window);  
  
该句在IE下会出错提示非法复制,后面的弹出框没有执行。其它浏览器则当window=55不存在,仍然弹出了window。

  

  

再重写下alert  
代码如下:

  
alert = 55;  
console.log(alert);  
  
IE下提示报错,Firefox/Chrome/Safari/Opera竟然被重写了,从对应的控制台可以看到输出了55。可以看出对于宿主环境提供的全局对象/函数,有的浏览器不支持重写,有的则可以重写 。

  

  

以下是两种方式声明全局变量  
代码如下:

  
a1 = 11;  
var a2 = 22;  
  
for(a in window){  
if(a=='a1'||a=='a2'){  
alert(a)  
}  
}  
  
上述代码在IE中不会弹出信息框,在IE中内部大概如下  
代码如下:
  
//IE  
with(host_object){//window  
with(global_object){//Global  
a1 = 11;  
var a2 = 22;  
}  
}  
  
即a1,a2是作为上面说的第一种,JS引擎提供的Global对象上的属性,而非第二种宿主环境提供的window对象上的属性。因此IE中for in window时a1,a2都不存在。如果IE中提供对象Global对象的引用,没准下面的代码可以弹出信息框。

  
代码如下:

  
for(a in Global){  
if(a=='a1'||a=='a2'){  
alert(a)  
}  
}  
  
Firefox/Safari/Chrome/Opera中内部大概是下面的样子  
代码如下:
  
//Firefox/Safari/Chrome/Opera  
with(host_object){//window  
a1 = 11;  
var a2 = 22;  
with(global_object){//Global  
}  
}  
  
即a1,a2是作为上面说的第二种,宿主环境提供的全局对象window上的属性。因此for in window时a1,a2都存在,弹出了信息框。

  

  

再看第三者方式声明全局变量window.a3 = 33,这样是显示的把a3挂在window上作为window的属性,因此在所有浏览器中for in window时都能获取到a3。

  

(责任编辑:admin)

TOP