浅析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 相关文章推荐
一个简单的Ext.XTemplate的实例代码
Mar 18 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
Sep 29 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
Feb 24 Javascript
JQuery中attr方法和removeAttr方法用法实例
May 18 Javascript
HTML页面,测试JS对C函数的调用简单实例
Aug 09 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
Oct 27 Javascript
js数字计算 误差问题的快速解决方法
Feb 28 Javascript
详细AngularJs4的图片剪裁组件的实例
Jul 12 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
Aug 03 Javascript
JavaScript运行原理分析
Feb 09 Javascript
socket io与vue-cli的结合使用的示例代码
Nov 01 Javascript
react中的DOM操作实现
Jun 30 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
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
2006/10/09 PHP
ThinkPHP 3.2 数据分页代码分享
2014/10/14 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
iframe 自适应高度[在IE6 IE7 FF下测试通过]
2009/04/13 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
2012/12/09 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
Js可拖拽放大的层拖动特效实现方法
2015/02/25 Javascript
JavaScript弹出对话框的三种方式
2016/03/23 Javascript
JavaScript定时器实现的原理分析
2016/12/06 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
2017/01/17 Javascript
angular 动态组件类型详解(四种组件类型)
2017/02/22 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
jQuery获取单选按钮radio选中值与去除所有radio选中状态的方法
2017/05/20 jQuery
vue2配置scss的方法步骤
2019/06/06 Javascript
微信小程序3种位置API的使用方法详解
2019/08/05 Javascript
详解Python3中的Sequence type的使用
2015/08/01 Python
Python星号*与**用法分析
2018/02/02 Python
numpy给array增加维度np.newaxis的实例
2018/11/01 Python
对Pycharm创建py文件时自定义头部模板的方法详解
2019/02/12 Python
利用Python查看微信共同好友功能的实现代码
2019/04/24 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
2019/12/12 Python
Tensorflow进行多维矩阵的拆分与拼接实例
2020/02/07 Python
django queryset相加和筛选教程
2020/05/18 Python
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
来自美国主售篮球鞋的零售商店:KICKSUSA
2017/11/28 全球购物
汉森批发:Hansen Wholesale
2018/05/24 全球购物
广州喜创信息技术有限公司JAVA软件工程师笔试题
2012/10/17 面试题
优秀党员获奖感言
2014/02/18 职场文书
竞聘上岗演讲
2014/05/19 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
酒店前台岗位职责
2015/04/16 职场文书
《草虫的村落》教学反思
2016/02/20 职场文书
JS前端监控采集用户行为的N种姿势
2022/07/23 Javascript
分享很少见很有用的SQL功能CORRESPONDING
2022/08/05 MySQL