Javascript中两种全局对象/函数的分析
这里是指主机环境的Javascript在浏览器环境。首先是ECMAscript全局对象,第二是全局对象/功能的主机环境下(主机)。1。核心Javascript内置对象,即ECMAscript实现提供不依赖于宿主环境对象
这些对象已经存在(实例化)在程序executed.ecmascript称为全局对象,将其分为以下
1,值属性的全局对象(全局对象的值属性)。
2、对功能属性的全局对象(全局对象的函数的性质)。有eval,parseInt,parseFloat,isnan,需得到encodeduri encodeURIComponent,,,
3、全局对象(全局对象的构造函数参数)的构造函数(类)的属性。有对象,函数,数组,字符串,布尔值,数字,日期,正则表达式,错误,evalerror,RangeError,RangeError,和布尔。
4、全局对象的属性(全局对象的其他属性),可以视为一个静态的java类,可以直接使用的类名称+数量+方法。有数学,JSON。
ECMAscript规范是指这些全局对象(全局对象),这是可写的属性,即,写的是真的,并列举(可数)是错误的,那就是,在不能enumerated.ecmascript有这样一段话
除非另有说明,全局对象的标准内置属性,全局:
虽然规范提到了全局对象可以重写,但是没有人可以重写它们。
复制代码代码如下所示:
南= 11;
eval = 22;
对象= 33;
数学= 44;
警戒(南);
警报(EVAL);
警报(对象);
警戒(数学);
全局对象、功能属性的全局对象的构造函数的全局对象(类),其他属性、楠、热解、对象、数学,分别为全局对象。因此,我们可以看到,其他是改写除了南无法改写在IE9(pre3) / safari.here只是一个四人的名单,有兴趣的可以是以上所有全局对象的一个一个测试。我们想表达的是,核心Javascript内置对象一般是改写,虽然谁也做不到。
下面的测试在枚举
复制代码代码如下所示:
为(var中的a){
警报(a);
}
对于(在评估VaR){
警报(a);
}
对于(对象中的var){
警报(a);
}
对于(数学中的var){
警报(a);
}
所有的浏览器都不会弹出,也就是说,属性没有被枚举。兴趣可以通过上面所有全局对象的枚举来测试。当然,对于一些浏览器,比如Firefox,一些全局对象被重写并可以被枚举。
两。宿主环境提供的全局对象/函数
例如,窗口,警觉,setTimeout,文件的位置,等等,大多数浏览器限制重写
复制代码代码如下所示:
窗口= 55;
警报(窗口);
该语句将在IE下非法复制,后弹出框不执行。当窗口= 55不存在时,其他浏览器仍然弹出窗口。
重写警报
复制代码代码如下所示:
警报= 55;
console.log(警告);
Firefox在伊江重写了,55的输出从相应的控制台中看到,可以看到为宿主环境提供的全局对象/函数,一些浏览器不支持重写,有些浏览器可以重写。
以下是声明全局变量的两种方式
复制代码代码如下所示:
A1=11;
var=22;
对于(在窗口中){
如果(= = = = |步骤的| 'a2){
警报(a)
}
}
上面的代码不会弹出伊江中的信息框,它可能在IE中,如下所示
复制代码代码如下所示:
伊江
与(host_object){ / /窗口
与(global_object){ / /全球
A1=11;
var=22;
}
}
也就是说,A1、A2是js引擎在全局对象上提供的第一种属性,而不是由第二类主机环境提供的窗口对象,因此,在IE中的窗口中不存在A1和A2,例如,如果在伊江提供对象全局对象的引用,下面的代码可以弹出信息框。
复制代码代码如下所示:
对于(全局的){
如果(= = = = |步骤的| 'a2){
警报(a)
}
}
Firefox的内部可能是以下内容
复制代码代码如下所示:
与(host_object){ / /窗口
A1=11;
var=22;
与(global_object){ / /全球
}
}
也就是说,A1是主机环境提供的全局对象窗口中的属性,作为第二个窗口,所以在Windows A1和A2中都存在并弹出信息框。
再看看第三,声明全局变量window.a3 = 33,说明A3挂在窗口的窗口的属性,所以在所有的浏览器,在窗口可以A3。