浅析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练习之表单验证实现代码
Dec 14 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
Sep 14 Javascript
js中return false(阻止)的用法
Aug 14 Javascript
点击显示指定元素隐藏其他同辈元素的方法
Feb 19 Javascript
EasyUI Combobox设置默认值 获取text的方法
Nov 28 Javascript
JavaScript中join()、splice()、slice()和split()函数用法示例
Aug 24 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
Sep 07 Javascript
vue全局自定义指令-元素拖拽的实现代码
Apr 14 Javascript
js验证身份证号码记录的方法
Apr 26 Javascript
mock.js模拟数据实现前后端分离
Jul 24 Javascript
vue实践---根据不同环境,自动转换请求的url地址操作
Sep 21 Javascript
vue-cli中实现响应式布局的方法
Mar 02 Vue.js
完美解决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
phpQuery占用内存过多的处理方法
2013/11/13 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
在Laravel中使用MongoDB的方法示例
2019/11/11 PHP
PHP实现随机发放扑克牌
2020/04/21 PHP
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
jquery ready函数、css函数及text()使用示例
2013/09/27 Javascript
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
AngularJS语法详解
2015/01/23 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
webpack构建react多页面应用详解
2017/09/15 Javascript
vue异步axios获取的数据渲染到页面的方法
2018/08/09 Javascript
vue动画打包后失效问题的解决方法
2018/09/18 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
2013/12/06 Python
Python文件操作类操作实例详解
2014/07/11 Python
Python在Console下显示文本进度条的方法
2016/02/14 Python
Python之str操作方法(详解)
2017/06/19 Python
python实现rsa加密实例详解
2017/07/19 Python
Python插件virtualenv搭建虚拟环境
2017/11/20 Python
解决python3中解压zip文件是文件名乱码的问题
2018/03/22 Python
对python append 与浅拷贝的实例讲解
2018/05/04 Python
python3中zip()函数使用详解
2018/06/29 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
python之cv2与图像的载入、显示和保存实例
2018/12/05 Python
Python FFT合成波形的实例
2019/12/04 Python
Tensorflow累加的实现案例
2020/02/05 Python
通信工程毕业生自荐信
2013/11/01 职场文书
党的群众路线教育实践活动心得体会900字
2014/03/07 职场文书
读群众路线的心得体会
2014/09/03 职场文书
放弃继承权公证书
2015/01/23 职场文书
导游词之塘栖古镇
2019/12/04 职场文书
详解Vue的options
2021/05/15 Vue.js
关于Python中进度条的六个实用技巧分享
2022/04/05 Python
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技
Windows和Linux上部署Golang并运行程序
2022/04/22 Servers