JavaScript高级程序设计之引用类型之单体内置对象之Global对象第5.7.1讲笔记

ECMA-262 对内置对象的定义是:“由ECMAScript 实现提供的、不依赖于宿主环境的对象,这些对

象在ECMAScript 程序执行之前就已经存在了。”意思就是说,开发人员不必显式地实例化内置对象,因

为它们已经实例化了。前面我们已经介绍了大多数内置对象,例如Object、Array 和String。
ECMA-262 还定义了两个单体内置对象:Global 和Math。
5.7.1 Global对象
Global(全局)对象可以说是ECMAScript 中最特别的一个对象了,因为不管你从什么角度上看,
这个对象都是不存在的。ECMAScript 中的Global 对象在某种意义上是作为一个终极的“兜底儿对象”
来定义的。换句话说,不属于任何其他对象的属性和方法,最终都是它的属性和方法。事实上,没有全
局变量或全局函数;所有在全局作用域中定义的属性和函数,都是Global 对象的属性。本书前面介绍
过的那些函数,诸如isNaN()、isFinite()、parseInt()以及parseFloat(),实际上全都是Global
对象的方法。除此之外,Global 对象还包含其他一些方法。
1. URI 编码方法
Global 对象的encodeURI()和encodeURIComponent()方法可以对URI(Uniform Resource
Identifiers,通用资源标识符)进行编码,以便发送给浏览器。有效的URI 中不能包含某些字符,例如
空格。而这两个URI 编码方法就可以对URI 进行编码,它们用特殊的UTF-8 编码替换所有无效的字符,
从而让浏览器能够接受和理解。
其中,encodeURI()主要用于整个URI(例如,http://www.wrox.com/illegal value.htm),而encode-
URIComponent()主要用于对URI 中的某一段(例如前面URI 中的illegal value.htm)进行编码。
它们的主要区别在于,encodeURI()不会对本身属于URI 的特殊字符进行编码,例如冒号、正斜杠、
问号和井字号;而encodeURIComponent()则会对它发现的任何非标准字符进行编码。来看下面的例子。
var uri = "http://www.wrox.com/illegal value.htm#start";
//"http://www.wrox.com/illegal%20value.htm#start"
alert(encodeURI(uri));
//"http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start"
alert(encodeURIComponent(uri));

使用encodeURI()编码后的结果是除了空格之外的其他字符都原封不动,只有空格被替换成了
%20。而encodeURIComponent()方法则会使用对应的编码替换所有非字母数字字符。这也正是可以
对整个URI 使用encodeURI(),而只能对附加在现有URI 后面的字符串使用encodeURIComponent()
的原因所在。
一 般 来 说 , 我们使用encodeURIComponent() 方法的时候要比使用
encodeURI()更多,因为在实践中更常见的是对查询字符串参数而不是对基础URI
进行编码。

与 encodeURI()和encodeURIComponent()方法对应的两个方法分别是decodeURI()和
decodeURIComponent()。其中,decodeURI()只能对使用encodeURI()替换的字符进行解码。例如,
它可将%20 替换成一个空格,但不会对%23 作任何处理,因为%23 表示井字号(#),而井字号不是使用
encodeURI()替换的。同样地,decodeURIComponent()能够解码使用encodeURIComponent()编码

的所有字符,即它可以解码任何特殊字符的编码。来看下面的例子:
var uri = "http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start";
//http%3A%2F%2Fwww.wrox.com%2Fillegal value.htm%23start
alert(decodeURI(uri));
//http://www.wrox.com/illegal value.htm#start
alert(decodeURIComponent(uri));

这里,变量uri 包含着一个由encodeURIComponent()编码的字符串。在第一次调用decodeURI()
输出的结果中,只有%20 被替换成了空格。而在第二次调用decodeURIComponent()输出的结果中,
所有特殊字符的编码都被替换成了原来的字符,得到了一个未经转义的字符串(但这个字符串并不是一
个有效的URI)。
URI 方法encodeURI()、encodeURIComponent()、decodeURI()和decode-
URIComponent()用于替代已经被ECMA-262 第3 版废弃的escape()和unescape()
方法。URI 方法能够编码所有Unicode 字符,而原来的方法只能正确地编码ASCII 字符。
因此在开发实践中,特别是在产品级的代码中,一定要使用URI 方法,不要使用escape()
和unescape()方法。

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
能够解释代码字符串的能力非常强大,但也非常危险。因此在使用eval()时必
须极为谨慎,特别是在用它执行用户输入数据的情况下。否则,可能会有恶意用户输
入威胁你的站点或应用程序安全的代码(即所谓的代码注入)。

3. Global 对象的属性

Global 对象还包含一些属性,其中一部分属性已经在本书前面介绍过了。例如,特殊的值
undefined、NaN 以及Infinity 都是Global 对象的属性。此外,所有原生引用类型的构造函数,像
Object 和Function,也都是Global 对象的属性。下表列出了Global 对象的所有属性。

ECMAScript 5 明确禁止给undefined、NaN 和Infinity 赋值,这样做即使在非严格模式下也会
导致错误。
4. window 对象
ECMAScript 虽然没有指出如何直接访问Global 对象,但Web 浏览器都是将这个全局对象作为
window 对象的一部分加以实现的。因此,在全局作用域中声明的所有变量和函数,就都成为了window
对象的属性。来看下面的例子。
var color = "red";
function sayColor(){
alert(window.color);
}
window.sayColor(); //"red"

这里定义了一个名为color 的全局变量和一个名为sayColor()的全局函数。在sayColor()内部,
我们通过window.color 来访问color 变量,以说明全局变量是window 对象的属性。然后,又使用
window.sayColor()来直接通过window 对象调用这个函数,结果显示在了警告框中。
JavaScript中的window 对象除了扮演ECMAScript规定的Global 对象的角色外,
还承担了很多别的任务。第8 章在讨论浏览器对象模型时将详细介绍window 对象。

另一种取得 Global 对象的方法是使用以下代码:
var global = function(){
return this;
}();

以上代码创建了一个立即调用的函数表达式,返回this 的值。如前所述,在没有给函数明确指定
this 值的情况下(无论是通过将函数添加为对象的方法,还是通过调用call()或apply()),this
值等于Global 对象。而像这样通过简单地返回this 来取得Global 对象,在任何执行环境下都是可
行的。第7 章将深入讨论函数表达式。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript高级程序设计 第五版》是一本经典的JavaScript编程指南,作者是Nicholas C. Zakas。这本书是Web开发人员学习和掌握JavaScript的重要资料之一。它被广泛认可为学习JavaScript的权威指南。 这本书以深入且系统的方式详细介绍了JavaScript语言的各个方面,包括语法、数据类型、函数、对象、DOM操作、事件处理、错误处理等内容。它不仅仅关注基础知识解,还涵盖了一些高级特性和技术,例如闭包、作用域、正则表达式、JSON、Ajax等。 《JavaScript高级程序设计 第五版》以清晰的语言和易懂的示例代码向读者展示JavaScript的核心概念和常见应用。它既适合初学者作为入门教材,也适合有一定经验的开发人员作为参考手册。 这本书的最新版本第五版,相较于前几个版本做了一些更新和改进。它增加了对ES6(ECMAScript 6)的解,介绍了一些新的语法和特性,如箭头函数、模块化、解构赋值等。此外,对于旧版中的错误和不完善之处也进行了修正。 总之,《JavaScript高级程序设计 第五版》是一本权威、全面而且易懂的JavaScript学习资料。无论你是初学者还是有一定经验的开发人员,都可以从这本书中获得宝贵的知识和技巧,提升自己的JavaScript编程能力。阅读这本书有助于理解JavaScript的核心概念,掌握有效的编程技巧,提升Web开发的能力和水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值