浅析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的模板类 Template
Dec 07 Javascript
js如何判断用户是否是用微信浏览器
Jun 05 Javascript
JavaScript实现动态创建CSS样式规则方案
Sep 06 Javascript
实例讲解JQuery中this和$(this)区别
Dec 08 Javascript
jQuery消息提示框插件Tipso
May 04 Javascript
jquery表单对象属性过滤选择器实例分析
May 18 Javascript
js实现将选中内容分享到新浪或腾讯微博
Dec 16 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
Jan 08 Javascript
Ajax和Comet技术总结
Feb 19 Javascript
canvas绘制爱心的几种方法总结(推荐)
Oct 31 Javascript
基于elementUI实现图片预览组件的示例代码
Mar 31 Javascript
JS实现长图上下滚动效果
Mar 19 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 SplObjectStorage使用实例
2015/05/12 PHP
PHP的命令行命令使用指南
2015/08/18 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
改善你的jQuery的25个步骤 千倍级效率提升
2010/02/11 Javascript
利用JavaScript实现新闻滚动效果(实例代码)
2013/11/27 Javascript
jquery性能优化高级技巧
2015/08/24 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
2019/08/07 Javascript
Node.js实现简单管理系统
2019/09/23 Javascript
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
深入解析Python中的list列表及其切片和迭代操作
2016/03/13 Python
初学python的操作难点总结(新手必看篇)
2017/08/03 Python
在python中实现对list求和及求积
2018/11/14 Python
Python通过for循环理解迭代器和生成器实例详解
2019/02/16 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
2019/02/19 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
Python 使用 environs 库定义环境变量的方法
2020/02/25 Python
python实现程序重启和系统重启方式
2020/04/16 Python
Python reques接口测试框架实现代码
2020/07/28 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
如何在Python3中使用telnetlib模块连接网络设备
2020/09/21 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
cosme官方海外旗舰店:日本最大化妆品和美容产品的综合口碑网站
2017/01/18 全球购物
ASOS亚洲:ASOS Asia
2018/03/04 全球购物
波兰家具和室内装饰品购物网站:Vivre
2018/04/10 全球购物
电子商务专业个人的自我评价分享
2013/10/29 职场文书
运输服务质量承诺书
2014/03/27 职场文书
最美护士演讲稿
2014/08/27 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
滴水洞导游词
2015/02/10 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
2015年酒店年度工作总结
2015/05/23 职场文书
蜗居观后感
2015/06/11 职场文书
新手初学Java List 接口
2021/07/07 Java/Android