浅析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 相关文章推荐
onkeydown事件解决按回车键直接提交数据的需求
Apr 11 Javascript
jquery用data方法获取某个元素上的事件
Jun 23 Javascript
javascript继承的六大模式小结
Apr 13 Javascript
纯JavaScript代码实现移动设备绘图解锁
Oct 16 Javascript
jquery validate.js表单验证入门实例(附源码)
Nov 10 Javascript
举例讲解jQuery中可见性过滤选择器的使用
Apr 18 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
Feb 18 Javascript
JavaScript的六种继承方式(推荐)
Jun 26 Javascript
jquery动态赋值id与动态取id方法示例
Aug 21 jQuery
详解webpack 打包文件体积过大解决方案(code splitting)
Apr 10 Javascript
vuejs实现标签选项卡动态更改css样式的方法
May 31 Javascript
vue2路由方式--嵌套路由实现方法分析
Mar 06 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开发中常用的三个表单验证函数使用小结
2010/03/03 PHP
PHP下操作Linux消息队列完成进程间通信的方法
2010/07/24 PHP
解析php中array_merge与array+array的区别
2013/06/21 PHP
PHP实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
PHP实现数组递归转义的方法
2014/08/28 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
Symfony的安装和配置方法
2016/03/17 PHP
可以文本显示的公告栏的js代码
2007/03/11 Javascript
判断多个input type=file是否有已经选择好文件的代码
2012/05/23 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
Jquery插件之Fancybox丰富的弹出层效果附源码下载
2015/12/02 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
JS实现两周内自动登录功能
2017/03/23 Javascript
基于webpack4搭建的react项目框架的方法
2018/06/30 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
详解JavaScript中精度失准问题及解决方法
2020/02/04 Javascript
javascript运行机制之执行顺序理解
2020/08/03 Javascript
JavaScript使用setTimeout实现倒计时效果
2021/02/19 Javascript
Python实现多并发访问网站功能示例
2017/06/19 Python
python3 map函数和filter函数详解
2019/08/26 Python
Python批量启动多线程代码实例
2020/02/18 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
一个不错的HTML5 Canvas多层点击事件监听实例
2014/04/29 HTML / CSS
HTML5 Convas APIs方法详解
2015/04/24 HTML / CSS
酒店服务实习自我鉴定
2013/09/22 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
金融系应届毕业生求职信
2014/05/26 职场文书
2014年内勤工作总结
2014/11/24 职场文书
基督教追悼会答谢词
2015/09/29 职场文书
2016庆祝教师节新闻稿
2015/11/25 职场文书
人民调解协议书
2016/03/21 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书
ROS系统将python包编译为可执行文件的简单步骤
2021/07/25 Python