Javascript-Golbal对象
Global对象(全局)对象可以说是ECMAscript中最特别的一个对象了,因为你不管从什么角度看,这个对象都是不存在的。
ECMAscript中的Golbal对象在某种意义上是作为一个终极的“兜底儿对象”来定义的。换句话说,不属于任何其他对象的属性和方法,最终都是它的属性和方法。没有全局变量或者是全局函数,所有在全局作用域中定义的属性和函数,都是Golbal对象的属性。例如:isNaN();isFinite();parseInt()以及parseFloat(),实际上都是Global对象的方法。除此之外,Global对象还有一些其他方法:
1、URI编码方法
Global对象的encodeURI()和encodeURIComponent()方法可以对URI(Uniform Resource Identifiers,同意资源标示符)进行编码,以便发送给游览器。有效的URI中不能包含某些字符,如空格。而这两个URI编码方法可以对URI进行编码。
其中,encodeURI()主要对整个URI,而encodeURIComponent()主要用于对URI中的某一段进行编码。它们的主要区别在于,encodeURI()不会对本身属于URI的特殊字符进行编码,例如冒号、正斜杠、问号和井字号;而encodeURIComponent()则会对它发现的任何非标准字符进行编码。
var uri = "http://www.cnblogs.com/huangt/p/ 3802735.html"; //"http://www.cnblogs.com/huangt/p/%20%20%20%20%203802735.html" alert(encodeURI(uri)); //"http%3A%2F%2Fwww.cnblogs.com%2Fhuangt%2Fp%2F%20%20%20%20%203802735.html" alert(encodeURIComponent(uri));
与encodeURI()和encodeURIComponent()方法对应的两个方法是decodeURI()和decodeURIComponent()。用来解码相应的字符。
2、eval()方法
ECMAScript语言中最强大的一个方法:eval()。eval()方法就是一个完整的ECMAScript语言解析器,它只接受一个参数,即要执行的ECMAScript(Javascript)字符串,看下面例子:
eval("alert('hi')");
这行代码的作用等价与下面这行代码:
alert('hi');
当解析器发现代码中调用eval()方法时,它会将传入的参数当作实际的ECMAScript语句来解析。然后把执行结果插入到原位置。通过eval()执行的代码被认为是包含该次调用的执行环境的一部分,因此被执行的代码具有与该执行环境相同的作用域。这意味着通过eval()执行的代码可以引用在包含环境中定义的变量,例:
var msg = "hello world!"; eval("alert(msg)"); //"hello world!"
可见,变量msg是在eval()调用的环境之外定义的,但其中调用的alert()仍然能显示”hello world!”。这是因为上面第二行代码最终被替换成了一行真正的代码。同样的,我们也可以在eval()调用中定义一个函数,然后再在该调用的外部代码中使用这个函数:
eval("function sayHi() { alert('hi'); }"); sayHi();
显然,函数sayHi()是在eval()内部定义的。但由于eval()的调用最终会被替换成定义函数的实际代码。因此可以在下一行调用sayHi()。对于变量也一样:
eval("var msg = 'hello world!'; ") alert(msg); // 'hello world'
在eval() 中创建的任何变量和函数都不会被提升,因为在解析代码的时候,它们被包含在一个字符串中;它们只在eval()执行的时候被创建。
严格模式下,在外部访问不到eval() 中创建的任何变量和函数,因此前面两个例子都会导致错误,为eval()赋值也会导致错误:
"use strict"; eval = "hi"; //causes error
3、Global对象的属性
下表中列举出Global对象的所有属性:
属性 说明 属性 说明 undefined
NaN
Infinity
Object
Array
Function
Boolean
String
Number特殊值underfined
特殊值NaN
特殊值Infinity
构造函数Object
构造函数Array
构造函数Function
构造函数Boolean
构造函数String
构造函数NumberDate
RegExp
Error
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError构造函数Date
构造函数RegExp
构造函数Error
构造函数EvalError
构造函数RangeError
构造函数ReferenceError
构造函数SyntaxError
构造函数TypeError
构造函数URIError
4、window对象
ECMAScript虽然没有指出如何直接访问Global对象,但Web浏览器都是将这个全局对象作为window对象的一部分加以实现的。因此,在全局作用域中声明的所有变量和函数,就都成为了window对象的属性。例如:
var color = "red"; function sayColor() { alert(window.color); }
这里定义了一个名叫color的全局变量和一个名叫sayColor()的全局函数。在sayColor()内部,我们通过window.color来访问color变量,以说明全局变量是window对象的属性。然后,又使用window.sayColor()来直接通过window对象调用这个函数,结果显示在了警告框中。
另一种取得Global对象的方法是使用一下代码:
var global = function() { return this; }
以上代码创建了一个立即调用的函数表达式,返回this的值。在没有给函数明确指定this值的情况下(无论是通过将函数添加为对象的方法,还是通过调用call()或者apply()),this值等于Golbal对象。像这样通过简单的返回this来取得Golbal对象,在任何情况下都是可行的。