浅析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 ajax 登录验证实现代码
Sep 23 Javascript
jquery load事件(callback/data)使用方法及注意事项
Feb 06 Javascript
js算法中的排序、数组去重详细概述
Oct 14 Javascript
javascript跨域原因以及解决方案分享
Apr 08 Javascript
js老生常谈之this,constructor ,prototype全面解析
Apr 05 Javascript
JS两种类型的表单提交方法实例分析
Nov 28 Javascript
超全面的javascript中变量命名规则
Feb 09 Javascript
javascript过滤数组重复元素的实现方法
May 03 Javascript
vue的常用组件操作方法应用分析
Apr 13 Javascript
node打造微信个人号机器人的方法示例
Apr 26 Javascript
JS实现马赛克图片效果完整示例
Apr 13 Javascript
解决Vue大括号字符换行踩的坑
Nov 09 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验证码代码
2012/02/27 PHP
PHP中操作ini配置文件的方法
2013/04/25 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
2015/02/12 PHP
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
javascript设置金额样式转换保留两位小数示例代码
2013/12/04 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
js中键盘事件实例简析
2015/01/10 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
JavaScript前端开发之实现二进制读写操作
2015/11/04 Javascript
利用types增强vscode中js代码提示功能详解
2017/07/07 Javascript
Webpack path与publicPath的区别详解
2018/05/03 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
Javascript实现时间倒计时功能
2018/11/17 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
2019/02/28 jQuery
你或许不知道的一些npm实用技巧
2019/07/04 Javascript
Python中给List添加元素的4种方法分享
2014/11/28 Python
Python中的生成器和yield详细介绍
2015/01/09 Python
使用Python编写vim插件的简单示例
2015/04/17 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
浅析python,PyCharm,Anaconda三者之间的关系
2019/11/27 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
django修改models重建数据库的操作
2020/03/31 Python
基于Python绘制个人足迹地图
2020/06/01 Python
Pygame框架实现飞机大战
2020/08/07 Python
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
迪卡侬中国官网:Decathlon中国
2020/08/10 全球购物
为什么要做架构设计
2015/07/08 面试题
寄语是什么意思
2014/04/10 职场文书
小学生学雷锋演讲稿
2014/04/25 职场文书
小学学雷锋活动总结
2014/04/25 职场文书
公司介绍信范文
2015/01/31 职场文书
《红领巾真好》教学反思
2016/02/16 职场文书
《蓝鲸的眼睛》读后感5篇
2020/01/15 职场文书
详解盒子端CSS动画性能提升
2021/05/24 HTML / CSS