动态函数式语言精髓与编程实践(JavaScript 版)

idkde

贡献于2014-05-09

字数:0 关键词: JavaScript开发

动态函数式语言精髓 与编程实践 (JavaScript 版) 周爱民 著 前言 1.1.1.1.1.1.1.1.语言 语言 语言 语言 我相信,在这个世界上无时不刻地在产生着新的语言。例如我刚才叫住我 脚下的这只小猫,我喊了一声“嗨”,它就停下来望着我。如同我与猫一样, 你可能正在用另外的一种语言——声音的,或者符号的——与另外一种个体进 行着交流。 无论这种个体是否是一个鲜活的生命,还是一堆电器元件,如果你们需要 交流,那么唯一的方式就是创生一种语言,或者使用两种个体既有的语言之一 进行交流。 我们一边在创生着与计算机交流的语言,一边也不得不用既有的语言与之 交流。这就是现状。这与此时我跟脚下的猫,或者数千年前的铸剑师与一柄剑 之间交流时的情状,是完全一样的。 语言是一种交流的工具,这约定了语言的“工具”本质,以及“交流”的 功用。“工具”的选择只在于“功用”是否能达到,而不在于工具是什么。 在数千年之前,远古祭师手中的神杖就是他们与神交流的工具。祭师让世 人相信他们敬畏的是神,而世人只需要相信那柄神杖。于是,假如祭师不小心 丢掉了神杖,就可以堂而皇之地再做一根。甚至,他们可以随时将旧的换成更 新或更旧的神杖,只要他们宣称这是一根更有利于通神的杖。对此,世人往往 做出迷惑的表情,或者欢欣鼓舞的情状。今天,这种表情或情状一样地出现在 大多数程序员的脸上,出现在他们听闻到新计算机语言被创生的时刻。 神杖换了,祭师还是祭师,世人还是会把头叩得山响。祭师掌握了与神交 流的方法(如果真如同他们自己说的那样的话),而世人只看见了神杖。 所以,泛义的工具是文明的基础,而确指的工具却是愚人的器物。 计算机语言有很多种分类方法,例如高级语言或者低级语言。其中一种分 类方法,就是“静态语言”和“动态语言”——事物就是如此,如果用一对绝 对反义的词来分类,就相当于概含了事物的全体。当然,按照中国人中庸平和 的观点,以及保守人士对未知可能性的假设,我们还可以设定一种中间态:半 动态语言。你当然也可以叫它半静态语言,这个随便你。 所以,我们现在是在讨论一种很泛义的计算机语言工具。至少在眼下,他 (在分类概念中)概含了计算机语言的二分之一。当然,限于我自身的能力,我 只能讨论一种确指的工具,例如 JavaScript。但我希望你看到的是计算机编程 方法的基础,而不是某种愚人的器物。JavaScript 的生命力可能足够顽强,我 假定它比 C还顽强,甚至比你的生命都顽强。但他只是愚人的器物,因此反过 来说:它能不能长久地存在都并不重要,重要的是它能不能作为这“二分之一 的泛义”来供我们讨论。 1.2.1.2.1.2.1.2.分类 法 分类 法 分类 法 分类 法 新打开一副扑克牌,我们总看到它被整齐的排在那里,从 A到K以及大 小王。接下来,我们将它一分为二,然后交叉在一起;再分开,再交叉……完 成了洗牌之后,我们便可以拿它新开一局了。但是你是否注意到在这个过程中 : 牌局的复杂性,其实不是由“分开”这个动作导致的,而是由“交叉”这个动 作导致的。 所以分类法本身并不会导致复杂性。就如同一幅新牌只有四套 A~K,我们 可以按十三牌面来分类,也可以按四种花色来分类。当你从牌盒里把他们拿出 来的时候,无论他们是以哪种方式分类的,这幅牌都不混乱。混乱的起因,在 于你交叉了这些分类。 同样的道理,如果世界上只有动态、静态两种语言,或者真有半动态语言 而你又有明确的“分类法”,那么开发人员将会迎来清醒明朗的每一天:我们 再也不需要花更多的时间却学习更多的古怪语言了。 然而,第一个问题便来自于分类本身。因为“非此即彼”的分类必然导致 特性的缺失——如果没有这样“非此即彼”的标准,就不可能形成分类。而特 性的缺失又正是开发人员所不能容忍的。我们一方面吃着碗里,一方面念着锅 里。即使锅里漂起来的那片菜叶未见得有碗里的肉好吃,我们也一定要捞起来 尝尝。而且大多数时候,由于我们吃肉吃腻了嘴,因此会觉得那片菜叶味道其 实更好。 所以首先是我们的个性,决定了我们做不成绝对的素食者或肉食者。当然 , 更有一些人说我们的确需要一个新的东西来使得我们更加强健。但不幸的是, 大多数提出这种需求的人,都在寻求杀死人狼的纯质银弹或者混合毒剂。无论 如何,他们要么相信总有一种事物是完美武器,或者更多的特性放在一些就变 成了魔力的来源。 我不偏向两种方法之任一。但是我显然看到了这样的结果,前者是我们在 不断地创造并特化某种特性,后者是我们在不断地混合种种特性。 更进一步的说,前者在产生新的分类法以试图让武器变得完美,后者则通 过混乱不同的分类法,以期望通过突变而产生奇迹。 二者相同之处,都在于需要更多的分类法。 函数式语言就是来源于另外的一种分类法。不过要说明的是,这种分类法 是计算机语言的原力之一。基本上来说,这种分类法在电子计算机的实体出现 以前,就已经诞生了。这种分类法的基础是“运算产生结果,还是运算影响结 果”。前一种思想产生了函数式语言(如Lisp)所在的“说明式语言”这一分类, 后者则产生了我们现在常见的 C、C++等语言所在的“命令式语言”这一分类。 然而我们已经说过,人们需要更多的分类的目的,是要么找到类似银弹的 完美武器,要么找到混合毒剂。所以一方面很多人宣称“函数式是语言的未来”, 另一方面也有很多人把这种分类法与前一种分类法混在一起,于是变成了我们 这本书所说的“动态函数式语言”——当然,毋庸置疑的是:还会有更多的混 合法产生。因为保罗·格雷厄姆(Paul Graham)已经做过这样的总结: 二十年来,开发新编程语言的一个流行的秘决是:取 C语言的计算模式, 逐渐地往上加 Lisp 模式的特性,例如运行时类型和无用单元收集。 保罗·格雷厄姆是硅谷著名的程序员之一,在 1995 年他和 Robert Morris 开 发了第一个基于 Web 的应用程序 Viaweb,该项目在 1998 年被雅虎(Yahoo)收 购。在 2002 年,他设计了一种垃圾邮件过滤器算法。他同时还是计算机程序 语言 Arc 的设计者,写了多本关于程序语言以及创业方面的书籍。在 2005 年 他和 3位合伙人成立了 Y Combinator 创业投资基金公司,专注于早期阶段的种 子投资。 然而这毕竟只是“创生一种新语言”的魔法。那么,到底有没有让我们在 这浩如烟海的语言家族中,找到学习方法的魔法呢? 我的答案是:看清语言的本质,而不是试图学会一门语言。当然,这看起 来非常概念化。甚至有人说我可能是从某本教材中抄来的,另外一些人又说我 试图在这本书里宣讲类似于我那本《大道至简》里的老庄学说。 其实这很冤枉。我想表达的意思不过是:如果你想把一幅牌理顺,最好的 法子,是回到他的分类法上,要么从 A到K整理,要么按四个花色整理。毕 竟,两种或者更多的分类法作用于同一事物,只会事物混淆而不是弄得更清楚 。 因此,本书从语言特性出发,把动态与静态,函数式与非函数式的语言特 性分列出来。先讲述每种特性,然后再讨论如何去使用(例如交叉)他们。 1.3.1.3.1.3.1.3.漏掉 了点 儿什么 漏掉 了点 儿什么 漏掉 了点 儿什么 漏掉 了点 儿什么 你会发现一个问题:无论是四种花色,还是 A到K的牌面,我们都漏掉了两张王。是的,这 正是问题之所在:这两种分类法是以特性为主的,而不是按照我们前面说的 “绝对一分为二 的方法”。因为如果用那样的方法,那么一副牌应该分为“王牌”和“非王牌”。 1.4.1.4.1.4.1.4.特性 特性 特性 特性 无论哪种语言(或其它工具)都有其独特的特性,以及借鉴自其它语言的特 性。有些语言通体没有“独特特性”,只是另外一种语言的副本,这更多的时 候是为了“满足一些人使用语言的习惯”。还有一些语言则基本上全是独特的 特性,这可能导致语言本身不实用,但却是其它语言的思想库。 我们已经讨论过这一切的来源。 对于 JavaScript 来说,除了动态语言的基本特性之外,它还有着与其创生 时代背景密切相关的一些语言特性。直到如今,JavaScript 的创建者还在小心 翼翼地增补着它的语言特性。在特性集的设定方面,JavaScript 一直以来都是 一个典范。 由于 JavaScript 轻量的、简洁的、直指语言本实的特性集设计,它成为解 剖动态语言的有效工具。这个特性集包括: 1. 一套原型继承的、基于对象的语言特性和对象系统 2. 一套支持自动转换的弱类型系统 3. 语言、类型相关的基础函数/方法 4. 动态语言与函数式语言的基本特性 需要被强调的是,JavaScript 非常苛刻地保证这些特性是相应语言领域中 的最小特性集(或称之为“语言原子”),这些特性在 JavaScript 中相互混合, 通过交错与补充而构成了丰富的、属于 JavaScript 自身的语言特性。 本书的主要努力之一,就是分解出这些语言原子,并重现将它们混合在一 起的过程与方法。通过从复杂性到单一语言特性的还原过程,让读者了解到语 言的本实,以及“层出不穷的语言特性”背后的真相。 1.5.1.5.1.5.1.5.合理 性 合理 性 合理 性 合理 性 本书之所以有趣,一个重要的原因是它讨论问题的角度,以及讨论这些问 题的目标与其它书籍全然不同。我在这本书中试图以一种多范型语言(当然, 我们已经知道它叫 JavaScript),来讨论不同语言范型之间的特性;用分解特性 的方法来讨论它们为什么、以及如何被结合在一起,变成了一种语言。 因为讨论的角度与目标的不同,本书中你会看到一些全然不同的观点。你 会发现这些观点可能在其它 JavaScript 书中,或者其它专论语言的书中都没有 出现过。于是,你会置疑:这些观点合理吗? 一个创生这种语言的人都没有提出的观点,或者其它语言大师在同类范型 的语言中都没有提出过的观点,的确是值得置疑的。我高兴看到这样的置疑, 并欢迎读者带着疑问将本书读下去。但你不应当先给出一个结论说:这不合理 , 因为没人这样说过,甚至语言的创生者可能都没有这样想过。 要人们抛弃一种观点来接受另一种,的确非常艰难。但我所认为的合理性 并不是一个人或者某些人所讲述的“论点”。声音越大、重复得越多的观点未 见得一定合理,没被这样大声地宣讲或重复的观点未见得就不合理。我经常的 问题是:存在的合理性。 如果一种事物“坚持不懈”地存在了十年或者一个时代,那么它必然有存 在的理由,也有被人接受的理由。这些理由本身可能荒诞(例如是因为商业而 非技术原因才有了 JavaScript 这个名字,而它原本是叫 Mocha),另一些也可 能 很接近本质(例如 lisp 这种语言居然还活着)。而我则试图去揭示 JavaScript 语言“被创造成这样”却仍然还活着的一些本质原因。这些原因是否因为没有 出自某个人或者某些人的观点而显得“不合理”,则正是我要忽略的。 因为如果我不忽略它,则我永远只能接受那些“看起来貌似合理”的观点 , 而这本书也就变成了重复之作。 1.6.1.6.1.6.1.6.技巧 技巧 技巧 技巧 技巧是“技术的取巧之处 ”,所以根本上来说,技巧也是技术的一部分。 很多人(也包括我)反对技巧的使用,是因为难于控制,并且容易破坏代码的可 读性。 哪种情况下代码是需要“易于控制”和“可读性强”的呢?通常,我们认 为在较大型的工程下需要“更好的控制代码”;在更多人共同开发的项目代码 上要求“更好的可读性”。然而,反过来说,在一些更小型的、不需要更多人 参与的项目中,“适度的”使用技巧是否就是可以接受的呢? 这取决于“需要、能够”维护这个代码的人对技巧的理解。这包括: � 技巧是否是语言特性支持的,还是仅特定版本所支持或根本就是 BUG ; � 技巧是否是唯一可行的选择,有没有不需要技巧的实现; � 技巧是为达到目的、实现功能,而不是为了表现技巧而出现在代码中的。 即使如此,我仍然希望每一个技巧的使用都有说明,甚至示例。如果维护 代码的人不能理解这个技巧,那么连代码本身都失去了价值,更何论技巧存在 于这份代码中的意义呢?所以本书中的例子的确要用到许多“技巧”,但我一 方面希望读者能明白,这是语言/框架内核实现过程中必须的,另一方面也希 望读者能从这些技巧中学习到它原本的技术/理论,以及活用的方法。 1.7.1.7.1.7.1.7.本书 讲的 不是技 巧 本书 讲的 不是技 巧 本书 讲的 不是技 巧 本书 讲的 不是技 巧 尽管我对技巧持以一种理解和宽容的态度,但我却要声明,我在本书中讲 述的并不是技巧。 这样说并不是要为我的“出尔反尔”争回一点面子。事实上,对很多人来 说,本书在讲述一个完全不同的语言类型。在这种类型的语言中,本书中讲述 的一切,都只不过是“正常的方法”。然而在其它类型的一些语言中,这些看 起来就成了技巧。例如在 JavaScript 中要改变一个对象方法指向的代码非常容 易,并且是语言本身赋予的能力;而在 Delphi/C++中,却成了“破坏面向对象 设计”的非正常手段——以至于在编译级与系统级受到层层阻挠。 你最好能改变一下思维来看待本书中讲述的方法之精髓。无论它对你产生 多大的冲击,你应该先想到的是这些方法的价值,而不是它对于“你所认为的 传统”的挑战——事实上,这些方法,在另一些“同样传统”的语言类型中, 已经存在了足够长久的时间,如同“方法”之与“对象”一样,原本就是那样 “(至少看起来)自然而然”地存在于它所在的语言体系之中。 语言特性的价值依赖于环境而得彰显。横行的螃蟹看起来古怪,但据说那 是为了适应一次地磁反转。螃蟹的成功在于适应了一次反转,失败(我们是说 导致它这样难看)之处,也在于未能又一次反转回来。 1.8.1.8.1.8.1.8.本书 讲什 么 本书 讲什 么 本书 讲什 么 本书 讲什 么 你当然可以置疑:为什么要有这样的一本书?是的,这的确是一个很好的 问题。 首先,这本书并不讲浏览器(Browser,例如 Internet Explorer)。这可能令 人沮丧。但的确如此。尽管在很多人看来,JavaScript 就是为浏览器而准备的 一种轻量的语言,并认为它离开了 DOM、HTML、CSS就没有意义。在同样 的“看法”之下,国内、外的书籍一提及 JavaScript,无不讲述浏览器上如何 开发,更多的是从“如何验证一个输入框值的有效性”讲起。 是的,最初我也是这样认为的。因为本书原来就是出自我在写《B端开发 》 这本书的过程之中。事实上,《B端开发》是一本讲述“在浏览器(Browser)上 如何用 JavaScript”来开发的书。然而,《B端开发》写到近百页就放下了,因 为我觉得应该写一本专门讲 JavaScript 的书,这更重要。 所以,现在你将要看到的这本书就与浏览器无关。在本书中,我将会把 JavaScript 提升到与 Java、C#或Delphi 一样的高度,来讲述它的语言实现与扩 展。由于在本书中的最后一部分内容中,讲述了名为“Qomo ”的完整的 JavaScript 框架,因此如果你需要在浏览器上构建大型应用(例如基于 Ajax 的工 程),那么你可以从 Qomo 中得益良多。Qomo 可以成倍地提高你的开发工效, 有利于你实现更多的、更有价值的应用特性。但是,嗯,本书不讲浏览器,不 讲WEB,也并不讲“通常概念下的”Ajax。 JavaScript 是一门语言,有思想的、有核心的、有灵魂的语言。如果你不 意识到这一点,那么你可能永远都只能拿它来做那个“检测值是否有效的输入 框”的代码。 本书讲述 JavaScript 的思想、核心、灵魂,以及如何去丰富它的血肉。主 要包括三个部分: � 动态、函数式语言,以及其它语言特性在 JavaScript 的表现与应用; � 如何用动态函数式语言的特性来扩展 JavaScript 的语言特性与框架; � 如何将 JavaScript 引擎整合到其它高级语言的开发过程中。 另外,这本书里有很多示例的代码是大同小异的。但对于 JavaScript 这种 语言来说,任何一点点看起来微不足道的变化,可能都源自对某些语言特性的 深刻理解。另一方面,一段相同的代码,在很多时候也可以从不同的语言类型 或特性来审视。 1.9.1.9.1.9.1.9.本书 的适 读者 本书 的适 读者 本书 的适 读者 本书 的适 读者 我试图给这本书找到一个适合的读者群体,但我发现很难。因为通常的定 义是低级、中级与高级,然而不同的用户对自己的“等级”的定义标准并不一 样。在这其中,有“十年学会编程”的谦谨者,也有“三天学会某某语言”的 速成家。所以,我认为这样定位读者的方式是徒劳的。 如果你想知道自己是否适合读这本书,建议你先看一下目录,然后试读一 二章节,可以选一些在你的知识库中看来很新鲜的,以及一些你自认为已经非 常了解的。通过对比,你应该知道这本书会给你带来什么。 不过我需要强调一些东西。这本书不是一本让你“学会某某语言”的书, 也不是一本让初学者“学会编程”的书。阅读本书,你至少应该有一点编程经 验(例如半年至一年),而且要摈弃某些偏见(例如C语言天下无敌或 JavaScript 是新手玩具)。 最后,你至少要有一点耐心与时间。 第一部分 语言基础 JavaScript 是怎样的一种语言 * JavaScript 的语法 - 通过语法给人们概念上的认识,表明“它是怎样”。基本效果是达到能编程和能阅读。 第二部分 语言特性及基本应用 - 从语言的分类学和各分类的进化出发,讲述 JS的历史与语言特性的成因。 * JavaScript 的非函数式语言特性 * JavaScript 的函数式语言特性 * JavaScript 的动态语言特性 第三部分 最佳实践 Qomo 项目简介 Qomo 的内核框架设计、实现及应用 一般性的动态函数式语言技巧 风格样张(排版) 但这个 typeof()中的括弧。 dodododo statemen t whilewhilewhilewhile((((expression );););); // 特殊代码片段 (一般是没有上下文关系的、单独的说明某种特定语法、语义或技巧 ) foo(); // this throws an error if (1) function foo() {} //大段代码示例 //示例 2:浏览器环境中使用的顶层对象是 window � 赋值语句:使用 “等号 (=)”赋值运算符 � 赋值语句:使用 “等号 (=)”赋值运算符 *注:JavaScr ipt 的方言是指 ECMAScr ipt 262 的某一种具体的实现。这种语言其实被广泛的用于 浏 览器环境、 WEB 服务器、操作系统和应用软件。但不同的环境与语言的实现版本之间都存在较大的 差 异。 1111 my_label:{ 2222 if(str&&str.length<10){ 3333 ////////错误一:错误一:错误一:错误一:在标签化语句中用使用 break而不带 lable 4444 break;break;break;break; 5555 } 6666 str=str.substr(str.length-10); 类型 直接量(v1)(v1)(v1)(v1) 包装类(v2)(v2)(v2)(v2) 特性 typeof instanceof v1 v2 v1 v2 undefined undefined Y 含义 详述 注 JavaScipt 脚本语言 一种语言的统称,由 ECMAScr ipt 262 规范。 * 浏览器 JavaScr ipt 在Netscape 和Mozilla 系列 中 , 浏 览 器 JavaScr ipt 被称 为 Cliet-Side JavaScr ipt。这包括 DOM、BOM 模型等在内的对象体系。 前言.........................................................................................................................................................3 1.1. 语言.................................................................................................................................3 1.2. 分类法............................................................................................................................ 4 1.3. 漏掉了点儿什么............................................................................................................6 1.4. 特性.................................................................................................................................6 1.5. 合理性............................................................................................................................ 7 1.6. 技巧.................................................................................................................................8 1.7. 本书讲的不是技巧........................................................................................................8 1.8. 本书讲什么....................................................................................................................9 1.9. 本书的适读者..............................................................................................................10 第一章 十年 JavaScript.............................................................................................................24 1.1. 第一段在网页中的代码..............................................................................................24 1.1.1. 新鲜的玩意儿......................................................................................................24 1.1.2. 第一段在网页中的代码......................................................................................25 1.1.3. 最初的价值..........................................................................................................26 1.2. 用JavaScript 来写浏览器上的应用...........................................................................27 1.2.1. 我要做一个聊天室..............................................................................................27 1.2.2. Flash 的一席之地.................................................................................................29 1.2.3. RWC 与RIA 之争...............................................................................................31 1.3. 没有框架与库的语言能怎样发展呢?......................................................................33 1.3.1. 做一个框架..........................................................................................................33 1.3.2. 重写框架的语言层..............................................................................................36 1.3.3. 富浏览器端开发(RWC)与Ajax..........................................................................37 1.4. 为JavaScript 正名........................................................................................................39 1.4.1. JavaScript..............................................................................................................39 1.4.2. Core JavaScript.....................................................................................................40 1.4.3. SpiderMonkey JavaScript.....................................................................................41 1.4.4. ECMAScript.........................................................................................................41 1.4.5. JScript...................................................................................................................41 1.5. [XXX] JavaScript 的应用环境....................................................................................43 1.5.1. 宿主环境(host environment)................................................................................43 1.5.2. 外壳程序(shell)....................................................................................................46 1.5.3. 运行期环境(runtime)...........................................................................................46 1.6. [XXX] 回顾.................................................................................................................47 第二章 JavaScript 的语法.........................................................................................................49 1.1. 语法综述......................................................................................................................49 1.1.1. 识别语法错误与运行错误..................................................................................50 1.2. JavaScript 的语法:变量声明.................................................................................... 51 1.2.1. 变量的数据类型..................................................................................................52 1.2.1.1. 值类型与引用类型..............................................................................53 1.2.2. 变量声明..............................................................................................................54 1.2.3. 变量声明中的一般性问题..................................................................................55 1.2.3.1. 字符串直接量、转义符......................................................................56 1.2.3.2. 数值直接量..........................................................................................58 1.2.3.3. 函数直接量声明..................................................................................59 1.2.3.4. 正则表达式的常见问题......................................................................59 1.2.3.5. 数组的常见问题..................................................................................61 1.3. JavaScript 的语法:表达式运算................................................................................62 1.3.1. 一般表达式运算..................................................................................................64 1.3.2. 逻辑运算..............................................................................................................65 1.3.3. 字符串运算..........................................................................................................66 1.3.4. 比较运算..............................................................................................................66 1.3.4.1. 等值检测..............................................................................................66 1.3.4.2. 序列检测..............................................................................................68 1.3.5. 赋值运算..............................................................................................................71 1.3.6. 函数调用..............................................................................................................72 1.3.7. 特殊作用的运算符..............................................................................................73 1.3.8. 运算优先级..........................................................................................................74 1.4. JavaScript 的语法:语句.............................................................................................76 1.4.1. 表达式语句..........................................................................................................78 1.4.1.1. 一般表达式语句..................................................................................79 1.4.1.2. 赋值语句与变量声明语句..................................................................81 1.4.1.3. 函数调用语句......................................................................................83 1.4.2. 分支语句..............................................................................................................88 1.4.2.1. 条件分支语句(if 语句)........................................................................88 1.4.2.2. 多重分支语句(switch语句)................................................................89 1.4.3. 循环语句..............................................................................................................93 1.4.4. 流程控制:一般子句..........................................................................................94 1.4.4.1. 标签声明..............................................................................................94 1.4.4.2. break 子句............................................................................................96 1.4.4.3. continue 子句.......................................................................................98 1.4.4.4. return 子句..........................................................................................100 1.4.5. 流程控制:异常................................................................................................101 1.5. 面向对象编程的语法概要........................................................................................103 1.5.1. 对象直接量声明与实例创建............................................................................104 1.5.1.1. 使用构造器创建对象实例................................................................104 1.5.1.2. 对象直接量声明................................................................................107 1.5.2. 对象成员列举、存取和删除............................................................................109 1.5.3. 属性存取与方法调用........................................................................................113 1.5.4. 对象及其成员的检查........................................................................................114 1.5.5. 可列举性............................................................................................................ 118 1.5.6. 缺省对象的指定................................................................................................120 1.6. 运算符的二义性........................................................................................................120 1.6.1. 加号“+”的二义性..............................................................................................121 1.6.2. 括号“()”的二义性........................................................................................ 123 1.6.3. 冒号“:”与标签的二义性............................................................................126 1.6.4. 大括号“{}”的二义性......................................................................................127 1.6.5. 逗号“,”的二义性...........................................................................................131 1.6.6. 方括号“[]”的二义性....................................................................................134 第三章 JavaScript 的非函数式语言特性..............................................................................140 1.1. 概述............................................................................................................................ 140 1.1.1. 命令式语言与结构化编程................................................................................140 1.1.2. 结构化的疑难....................................................................................................142 1.1.3. “面向对象语言”是突破吗?........................................................................146 1.1.4. 更高层次的抽象:接口....................................................................................149 1.1.5. 再论语言的分类................................................................................................151 1.1.6. JavaScript 的命令式语言渊源..........................................................................153 1.2. 基本语法的结构化含义............................................................................................154 1.2.1. 基本逻辑与代码分块........................................................................................155 1.2.2. 模块化的层次:语法作用域............................................................................158 1.2.2.1. 主要的语法作用域及其效果............................................................159 1.2.2.2. 语法作用域之间的相关性................................................................163 1.2.3. 执行流程及其变更............................................................................................165 1.2.3.1. 级别 2:“break