浅析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 相关文章推荐
prototype Element学习笔记(篇一)
Oct 26 Javascript
javascript 对表格的行和列都能加亮显示
Dec 26 Javascript
JavaScript 快捷键设置实现代码
Mar 13 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
May 10 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
Dec 17 Javascript
jQuery选择器实例应用
Jan 05 Javascript
原生javascript实现读写CSS样式的方法详解
Feb 20 Javascript
ES6基础之解构赋值(destructuring assignment)
Feb 21 Javascript
vue使用axios上传文件(FormData)的方法
Apr 14 Javascript
jQuery控制input只能输入数字和两位小数的方法
May 16 jQuery
JavaScript中EventBus实现对象之间通信
Oct 18 Javascript
canvas绘制折线路径动画实现
May 12 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
?生?D片??C字串
2006/12/06 PHP
PHP中使用虚代理实现延迟加载技术
2014/11/05 PHP
php+mysql实现简单的增删改查功能
2015/07/13 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
jquery BS,dialog控件自适应大小
2009/07/06 Javascript
jQuery1.6 使用方法一
2011/11/23 Javascript
window.location.href的用法(动态输出跳转)
2014/08/09 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
浅析JavaScript动画模拟拖拽原理
2016/12/09 Javascript
JavaScript 实现 Tab 点击切换实例代码
2017/03/25 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
关于Vue实现组件信息的缓存问题
2017/08/23 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
Vue中插入HTML代码的方法
2018/09/21 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
2019/08/22 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
结合Python的SimpleHTTPServer源码来解析socket通信
2016/06/27 Python
Python实现PS图像调整之对比度调整功能示例
2018/01/26 Python
python数据分析数据标准化及离散化详解
2018/02/26 Python
python利用微信公众号实现报警功能
2018/06/10 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
2019/07/11 Python
Python实现图片识别加翻译功能
2019/12/26 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
2020/06/29 Python
惠普墨西哥官方商店:HP墨西哥
2016/12/01 全球购物
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理
2015/03/25 面试题
新闻发布会策划方案
2014/06/12 职场文书
关于国庆节的演讲稿
2014/09/05 职场文书
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书
农村结婚典礼主持词
2015/06/29 职场文书
消费者理赔投诉书
2015/07/02 职场文书
2016年公共机构节能宣传周活动总结
2016/04/05 职场文书