浅析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 相关文章推荐
js中parseInt函数浅谈
Jul 31 Javascript
通过隐藏iframe实现文件下载的js方法介绍
Feb 26 Javascript
jquery移除、绑定、触发元素事件使用示例详解
Apr 10 Javascript
node.js中的buffer.copy方法使用说明
Dec 14 Javascript
JavaScript中的splice()方法使用详解
Jun 09 Javascript
Css3制作变形与动画效果
Jul 24 Javascript
javascript电商网站抢购倒计时效果实现
Nov 19 Javascript
JavaScript之Canvas_动力节点Java学院整理
Jul 04 Javascript
vue单页开发父子组件传值思路详解
May 18 Javascript
解决vue.js提交数组时出现数组下标的问题
Nov 05 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
Nov 13 Javascript
vue制作抓娃娃机的示例代码
Apr 17 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新手上路(八)
2006/10/09 PHP
浅谈php serialize()与unserialize()的用法
2013/06/05 PHP
比较strtr, str_replace和preg_replace三个函数的效率
2013/06/26 PHP
刷新PHP缓冲区为你的站点加速
2015/10/10 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
PHP常用函数之获取汉字首字母功能示例
2019/10/21 PHP
jquery 分页控件实现代码
2009/11/30 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
基于jquery的文章中所有图片width大小批量设置方法
2013/08/01 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
JS 打印功能代码可实现打印预览、打印设置等
2014/10/31 Javascript
JavaScript获取当前网页最后修改时间的方法
2015/04/03 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
2016/09/21 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
详解React的回调渲染模式
2020/09/10 Javascript
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
python3编写ThinkPHP命令执行Getshell的方法
2019/02/26 Python
基于Django快速集成Echarts代码示例
2020/12/01 Python
英国二手物品交易网站:Preloved
2017/10/06 全球购物
英国女装网上商店:I Saw It First
2018/10/18 全球购物
Shell如何接收变量输入
2016/08/06 面试题
计算机应用与科学个人的自我评价
2013/11/15 职场文书
应届毕业生自我评价分享
2013/12/15 职场文书
大学生涯自我鉴定
2014/01/16 职场文书
护士毕业自我鉴定
2014/02/07 职场文书
安全生产中长期规划实施方案
2014/02/21 职场文书
2014年质量工作总结
2014/11/22 职场文书
服务承诺书
2015/01/19 职场文书
Python 的演示平台支持 WSGI 接口的应用
2022/04/20 Python
Python 匹配文本并在其上一行追加文本
2022/05/11 Python
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers