浅析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 相关文章推荐
jQuery解决iframe高度自适应代码
Dec 20 Javascript
jQuery链式操作如何实现以及为什么要用链式操作
Jan 17 Javascript
js 程序执行与顺序实现详解
May 13 Javascript
javascript禁制后退键(Backspace)实例代码
Nov 15 Javascript
给ListBox添加双击事件示例代码
Dec 02 Javascript
jquery 淡入淡出效果的简单实现
Feb 07 Javascript
node.js 使用ejs模板引擎时后缀换成.html
Apr 22 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
Aug 27 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
Feb 20 Javascript
Bootstrap超大屏幕的实现代码
Mar 22 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
May 24 Javascript
移动前端图片压缩上传的实例
Dec 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
德生9700DX电路分析
2021/03/02 无线电
PHP 字符串操作入门教程
2006/12/06 PHP
基于curl数据采集之正则处理函数get_matches的使用
2013/04/28 PHP
PHP跳转页面的几种实现方法详解
2013/06/08 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
JavaScript的面向对象方法以及差别
2008/03/31 Javascript
JQuery datepicker 使用方法
2011/05/20 Javascript
javascript学习笔记(十) js对象 继承
2012/06/19 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
2013/06/21 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
10个最优秀的Node.js MVC框架
2017/08/24 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
javaScript中&quot;==&quot;和&quot;===&quot;的区别详解
2018/03/16 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
2019/07/04 Javascript
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
JS操作JSON常用方法(10w阅读)
2020/12/06 Javascript
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
对python模块中多个类的用法详解
2019/01/10 Python
Python实现剪刀石头布小游戏(与电脑对战)
2019/12/31 Python
Python之变量类型和if判断方式
2020/05/05 Python
python使用建议与技巧分享(一)
2020/08/17 Python
python3中TQDM库安装及使用详解
2020/11/18 Python
html5中如何将图片的绝对路径转换成文件对象
2018/01/11 HTML / CSS
使用HTML5 Canvas API绘制弧线的教程
2016/03/22 HTML / CSS
澳大利亚二手奢侈品网站:Modsie
2019/09/23 全球购物
AOP的定义以及作用
2013/09/08 面试题
市场营销专业毕业生自荐信
2013/11/02 职场文书
后进生转化工作制度
2014/01/17 职场文书
顶撞领导检讨书
2014/01/29 职场文书
幼儿园小班教学反思
2014/02/02 职场文书
学生自我评语大全
2014/04/18 职场文书
2014年终工作总结范本
2014/12/15 职场文书