浅析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 相关文章推荐
qTip 基于JQuery的Tooltip插件[兼容性好]
Sep 01 Javascript
onclick与listeners的执行先后问题详细解剖
Jan 07 Javascript
JavaScript中的类数组对象介绍
Dec 30 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
Jun 15 Javascript
javascript中eval和with用法实例总结
Nov 30 Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
Jul 05 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
Apr 13 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
Jun 22 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
Feb 09 Javascript
基于Angularjs-router动态改变Title值的问题
Aug 30 Javascript
JS异步错误捕获的一些事小结
Apr 26 Javascript
原生javascript中this几种常见用法总结
Feb 24 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
dedecms系统常用术语汇总
2007/04/03 PHP
php树型类实例
2014/12/05 PHP
php实现简单爬虫的开发
2016/03/28 PHP
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
2017/08/17 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
浅谈javascript的数据类型检测
2010/07/10 Javascript
JS限制上传图片大小不使用控件在本地实现
2012/12/19 Javascript
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
JavaScript清空数组元素的两种方法简单比较
2015/07/10 Javascript
AngularJS中的JSONP实例解析
2016/12/01 Javascript
JS实现淡入淡出图片效果的方法分析
2016/12/20 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
2017/02/15 Javascript
nodejs用gulp管理前端文件方法
2018/06/24 NodeJs
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
python读写ini文件示例(python读写文件)
2014/03/25 Python
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
Python实现发送QQ邮件的封装
2017/07/14 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
2018/05/04 Python
pandas 空的dataframe 插入列名的示例
2018/10/30 Python
Python 获取ftp服务器文件时间的方法
2019/07/02 Python
Keras实现DenseNet结构操作
2020/07/06 Python
CSS3图片旋转特效(360/60/-360度)
2013/10/10 HTML / CSS
英国在线汽车和面包车零件商店:Car Parts 4 Less
2018/08/15 全球购物
PHP解析URL是哪个函数?怎么用?
2013/05/09 面试题
AJAX应用和传统Web应用有什么不同
2013/08/24 面试题
教师党性分析材料
2014/02/04 职场文书
《雷雨》教学反思
2014/02/20 职场文书
布达拉宫的导游词
2015/02/02 职场文书
教师岗位职责
2015/02/03 职场文书
食堂采购员岗位职责
2015/04/03 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书
什么是检讨书?检讨书的格式及范文
2019/11/05 职场文书