Page 155 - Node.js开发指南
P. 155

148  附录 A  JavaScript 的高级特性


                 长久以来,JavaScript  总是被广大的专业开发者轻视,不少人以为 JavaScript  是像
             VBScript 一样的雕虫小技,或者说是给非专业的网页设计者用的简易工具。而早期的因特网
             上也恰恰流传着大量低质量的 JavaScript 代码,很多都是可视化网页设计工具生成的,复杂
             而混乱,更加深了人们对它的不良印象。在当时,JavaScript  的一个主要作用是在网页上显
             示出花哨的效果,譬如弹出令人厌烦的广告窗口。
                 早期的 JavaScript 运行效率低下、浏览器兼容性问题严重。就连 JavaScript 之父 Brendan
             Eich 都觉得它很烂,从来没有想过它能够发展成今天的样子。后来随着以 Gmail  为代表的
             Web 2.0 应用的兴起,人们开始重新认识 JavaScript。
                 JavaScript  经历了一个十分纠结的发展过程,因为 ECMAScript 新标准总是在提出后若
             干年才会被浏览器开发商陆续实现,所以开发者不得不忍痛割爱放弃许多 JavaScript 优美的
             新特性,以保持浏览器之间的兼容性。值得庆幸的是,这些问题在 Node.js 中已不复存在,
             我们可以放心地享受 JavaScript 的全部特性给我们带来的便利了。这些特性大多已经是现代
             编程语言共有的理念,例如面向对象、函数式编程思想、lambda 演算、闭包、动态绑定等。
                 我假设你了解 JavaScript 的基本语法,并且对面向对象的语言有一定的理解,如果你还
             知道函数式编程(functional programming),那么你将可以很容易地理解闭包。本附录通过
             大量的示例帮你了解 JavaScript 众多特性,理解 JavaScript 背后的机制。我们以作用域、闭
             包和对象为线索,介绍 JavaScript 编程中常用到的特性和技巧。

             A.1 作用域


                 作用域(scope)是结构化编程语言中的重要概念,它决定了变量的可见范围和生命周
             期,正确使用作用域可以使代码更清晰、易懂。作用域可以减少命名冲突,而且是垃圾回收
             的基本单元。和 C、C++、Java 等常见语言不同,JavaScript 的作用域不是以花括号包围的块
             级作用域(block scope),这个特性经常被大多数人忽视,因而导致莫名其妙的错误。例如
             下面代码,在大多数类 C 的语言中会出现变量未定义的错误,而在 JavaScript 中却完全合法:

                 if (true) {
                   var somevar = 'value';
                 }
                 console.log(somevar); // 输出 value
                 这是因为 JavaScript 的作用域完全是由函数来决定的,if、for 语句中的花括号不是独
             立的作用域。

             A.1.1  函数作用域


                 不同于大多数类 C 的语言,由一对花括号封闭的代码块就是一个作用域,JavaScript 的
   150   151   152   153   154   155   156   157   158   159   160