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


Posted in Javascript onDecember 05, 2013

这里所说的JavaScript指浏览器环境中的包括宿主环境在内的。第一种是ECMAScript Global Object,第二种是宿主环境(Host)下的全局对象/函数。

一、核心JavaScript内置对象,即ECMAScript实现提供的不依赖于宿主环境的对象

这些对象在程序执行之前就已经(实例化)存在了。ECMAScript称为The Global Object,分为以下几种

1, 值属性的全局对象(Value Properties of the Global Object)。有NaN,Infinity,undefined。

2, 函数属性的全局对象(Function Properties of the Global Object)。有eval,parseInt,parseFloat,isNaN,isFinite,decodeURI,encodedURI,encodeURIComponent

3,构造器(类)属性的全局对象(Constructor Properties of the Global Object)。有Object,Function,Array,String,Boolean,Number,Date,RegExp,Error,EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError。

4,其它属性的全局对象(Other Properties of the Global Object),可以看出成是Java中的静态类,可以直接用类名+点号+方法名使用。有Math,JSON。

ECMAScript规范提到这些全局对象(The Global Object)是具有Writable属性的,即Writable为true,枚举性(Enumerable)为false,即不能用for in枚举。ECMAScript有这么一段

Unless otherwise specified, the standard built-in properties of the global object have attributes {[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}.

虽然规范提到The Global Object是可以被重写的,但不会有谁去重写它们的。这里仅仅做个测试。

NaN    = 11; 
eval   = 22; 
Object = 33; 
Math   = 44; alert(NaN); 
alert(eval); 
alert(Object); 
alert(Math);<BR>

分别取值属性的全局对象, 函数属性的全局对象,构造器(类)属性的全局对象,其它属性的全局对象NaN,eval,Object,Math。结果如下浅析JavaScript中两种类型的全局对象/函数

结果可以看出除了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。

Javascript 相关文章推荐
JavaScript中常见的字符串操作函数及用法汇总
May 04 Javascript
jQuery实现图片左右滚动特效
Apr 20 Javascript
Bootstrap 实现查询的完美方法
Oct 26 Javascript
Angular下H5上传图片的方法(可多张上传)
Jan 09 Javascript
JavaScript中offsetWidth的bug及解决方法
May 17 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
Jul 06 Javascript
简单的网页广告特效实例
Aug 19 Javascript
jQuery Collapse1.1.0折叠插件简单使用
Aug 28 jQuery
详解原生JS动态添加和删除类
Mar 26 Javascript
基于Layui自定义模块的使用方法详解
Sep 14 Javascript
js实现开关灯效果
Mar 30 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
Jul 13 Javascript
完美解决IE低版本不支持call与apply的问题
Dec 05 #Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
Dec 05 #Javascript
jQuery表格插件ParamQuery简单使用方法示例
Dec 05 #Javascript
各浏览器对document.getElementById等方法的实现差异解析
Dec 05 #Javascript
给事件响应函数传参数的四种方式小结
Dec 05 #Javascript
弹出最简单的模式化遮罩层的js代码
Dec 04 #Javascript
js如何设置在iframe框架中指定div不显示
Dec 04 #Javascript
You might like
php入门教程 精简版
2009/12/13 PHP
解析PHP中的unset究竟会不会释放内存
2013/07/18 PHP
PHP5.5迭代生成器用法实例详解
2016/03/16 PHP
PHP动态生成指定大小随机图片的方法
2016/03/25 PHP
JavaScript 通过模式匹配实现重载
2010/08/12 Javascript
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
纯js分页代码(简洁实用)
2013/11/05 Javascript
JS判断表单输入是否为空(示例代码)
2013/12/23 Javascript
解决JS中乘法的浮点错误的方法
2014/01/03 Javascript
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
2015/08/22 Javascript
jQuery实现图片轮播特效代码分享
2015/09/15 Javascript
Bootstrap 粘页脚效果
2016/03/28 Javascript
js微信分享API
2020/10/11 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
webpack学习--webpack经典7分钟入门教程
2017/06/28 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
2017/08/16 Javascript
javascript中神奇的 Date对象小结
2017/10/12 Javascript
浅谈Vue下使用百度地图的简易方法
2018/03/23 Javascript
[02:16]DOTA2超级联赛专访Burning 逆袭需要抓住机会
2013/06/24 DOTA
[01:16]DOTA2小知识课堂 Ep.03 芒果树无伤肉山
2019/12/05 DOTA
Python fileinput模块使用实例
2015/05/28 Python
web.py 十分钟创建简易博客实现代码
2016/04/22 Python
Python优化技巧之利用ctypes提高执行速度
2016/09/11 Python
python实现大量图片重命名
2020/03/23 Python
基于python操作ES实例详解
2019/11/16 Python
python实现udp传输图片功能
2020/03/20 Python
django跳转页面传参的实现
2020/09/17 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
2020/12/21 Python
详解Django中的FBV和CBV对比分析
2021/03/01 Python
HTML5+CSS3实现拖放(Drag and Drop)示例
2014/07/07 HTML / CSS
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
兴趣小组活动总结
2014/05/05 职场文书
原生JS中应该禁止出现的写法
2021/05/05 Javascript