JavaScript 应邀撰写一个新的系列,请大家试读一部分,看看反响

nightire · 2013年11月06日 · 最后由 boyishwei 回复于 2014年01月30日 · 5640 次阅读

这段时间在外地出差,没有写什么干货奉献给诸位。倒是应邀发起了一个项目,其中有一部分是写一些技术主题的文章,主张是对初学者友好,但对不求甚解者无爱,所以要求文章的起点要低,分析要透,但含金量要保证。

于是我起了个头,先写了一篇:http://very-geek.github.io/javascript/formal-javascript-1.html

但是写完之后就觉得不爽,过去行文一直都很方正,这次很想跳出那个框框,挑战一下自己。于是重新构思了一下进行改写。

改写的过程倒是蛮顺利的,但就是感觉有点收不住了,也不知道是自己驾驭不好还是太过于追求些变化的缘故。于是写到一般的时候感觉自然而然收住了,心里不太有底,不知道这样的文章到底接受度如何,索性把已经改完的部分放出来给大家评定评定,收集点意见反馈什么的,有空的不妨一看。

nightire(以下简称 n):嗨,大家好!我是太极客(Very Geek,以下简称 VG)的 [nightire][nightire],非常高兴在“对话”节目中和大家见面并为大家担任本期节目的主持。

今天是“对话”的试播集,我们将从一些轻松的话题聊起。先介绍一下参加试播集的两位重量级嘉宾——他们来自于赫赫有名的艾柯玛·斯科瑞普特(即 ECMAScript)家族,分别是艾柯玛·斯科瑞普特三世(即 ECMAScript 3,以下简称 ES3)和艾柯玛·斯科瑞普特五世(即 ECMAScript 5,以下简称 ES5)——有请两位,欢迎!

(啪啪啪的掌声中,俩二货闪着光登场,落座……)

n:两位好。

ES5:主持人您好!

ES3:> Uncaught Exception...

n:……

ES3:Whoops...(换引擎中……)OK,搞定了!哈哈~主持人好,各位亲爱的朋友们,大家好啊,哥想死你们啦!

n:(汗~)呃,三哥你一登场就出状况啊,这里的环境还适应吗?

ES3:小 case!对于程序员来说,这点问题算个什么啊!(面向观众)你们说是不是啊?

(观众大笑)

n:好吧,言归正传。因为今天呢是试播集,主要的目的是让大家熟悉我们节目的风格和气氛,所以我们也不打算探讨过于深奥的技术主题,让我们先从几个小问题开始吧?

ES3 & ES5: OK!

n:说到 ECMAScript 家族,那可真是如雷贯耳,特别是近几年风头正盛,光彩照人。不过对于绝大多数开发者来说,还是 JavaScript 这个名字更加亲切熟悉一些,不知道二位对此有何看法,或者说你们家族内部更喜欢哪一种称呼呢?

ES5:只有一个 ECMAScript,我们和 Java 没有一毛钱关系!

ES3:啊哈哈,我家五弟向来就是这样啦,请大家包含则个~不过说起来呢也没错,这段历史真是错综复杂,令人不胜唏嘘啊……(做沧桑状)

n:那……可以请三哥给大家伙儿讲讲吗?

ES3:呃,这个嘛,总之……哎呀,其实我历史一直学得不好啦!但是这也不能全怪我,祖上那些个破事实在是太纠结了,这些年我一直专注于处理各种兼容性问题,哪儿有时间温习历史呢你说是不是?不过如果大家真的对我们家族的历史感兴趣的话,不妨去维基百科看看吧,上面已经整理的八九不离十了。一定要我说的话,那我就捡些边角料,大家伙儿凑合凑合吧!

n:嗯嗯,请继续!(八卦之火熊熊燃烧)

ES5:三哥……

ES3:停!我知道你又想说临出门时家里老头子交代过让你管住我的嘴是吧?你放心吧,三哥啥大风大浪没见过?就这点小玩意儿想从我嘴里套话?DO DREAM!!!

n:^^

ES3:接下来的话我不负责任的啊,剪辑的时候把我们脸挡住……据我奶奶的奶奶的奶奶说(有这么久嘛?!),祖上也就是一种田的,毫无名气。直到 1995 年 5 月,一个叫 [Brendan Eich][brendan_eich] 的货成功的把我家老祖宗忽悠出山给他做实验室小白鼠了。据说整个过程只用了这货十天时间,上帝保佑——超级大忽悠!

n: 就是那个在 Mozilla 工作的 Brendan Eich 大神吧?

ES5:对,就是这货!直到现在见了面还让我们管他叫干爹来着,我就呸!

ES3:主持人!这段你一定帮我们掐掉!

ES5:你就胆儿小吧!刚才正好说到了 Mozilla,就不得不提起另外一个人:Marc Andreessen。Brendan 把老祖宗带去 Netscape 的时候,这货正在喝咖啡,以下是他们二人的对话,不负责任转载啊。

“Brendan,这就是你带来的家伙?”
“没错,伙计,就是他了!”
“看起来真心很一般嘛!”
“可别这么说,穷乡僻壤的,能找到一个说话还算利索的已经很不容易了……”
“唔,这倒也是,辛苦了。喂,新来的你叫什么名字?”
“……”
“Brendan,他怎么回事?你不是说他说话还算利索吗?”
“我是这么说过,不过他们那儿不流行起名字,他的尊号恐怕是羞于启齿吧?”
“啊!这可不行!我们干的是大事情,大事情,你懂吗?干大事情的人就得有个体面的,响亮的名字!”
“好吧好吧,这个你说了算。”
“我做主吗?让我想想……嗯,今天的咖啡真不错——对了,就叫他 Mocha 吧,怎么样?”
“就这么定了!”

n:这么说,最开始既不叫艾柯玛,也不叫爪哇,而是叫摩卡对吗?

ES3:对的。事实上刚听到这个名字时感觉还不错,若不是后来我知道了名字的来历,我对 Marc 那家伙也不会有什么意见。但是你们这群号称本星球最牛叉的生物,打着“二逼与智慧并存”旗号的程序员们,其实就是一群吃货有没有!!!看看你们起的那些个名字吧,有多少是不能吃的或者喝的?

(ES5 把头深深埋进了裤裆里……)

n:那个……五弟,你对此怎么看?

ES5:呃,我倒不反对起的名字和吃的有关,听起来即可爱又亲切……

ES3:那是因为你也是个吃货!

ES5:……

n:那后来发生了什么?爪哇和艾柯玛是怎么和你们家族扯上关系的?

ES5:其实也还是 1995 年的事情,Mocha 这个名字几乎没怎么对外宣称过。大家也都清楚,那个年代 Java 是多么的受欢迎。顺带一提,我不讨厌 Java 语言,我讨厌的只是那些自称 Java 拥趸们浮夸的行事作风,仗着跨平台的虚拟机所带来的优势,他们什么领域都想插一脚,这也太没节操了!

n:其实这几年 Node.js 在服务器端编程也挺火的……

ES5:只有一个 ECMAScript!让我再重申一遍!

n:OKOKOK,请继续——

ES5:那时候 Netscape 的目标在于占领浏览器市场,Marc Andreessen 试图为他的浏览器引入更多更强大的特性来吸引开发者和终端用户。历史总是睿智的,事实证明 JVM 也不是无所不能,至少在浏览器这个领域,当年的 Java Applet 就像个笑话,这东西没法和浏览器很好地协同工作。所以我们老祖宗一开始是作为一种补充出现在浏览器领域的,可能是仓促了些,但是谁知道呢?瞧瞧今天吧,在 Web 的世界里,我们才是王者!至于名字?在 Mocha 之后,短暂的改成了 LiveScript——其实我更喜欢这个!但在当时,形势比人强,为了抱上 Java 的大腿,于是很快更名为 JavaScript……呕~~~每每想到这一点,我就无法自制的想吐来着……抱歉,失态了!

n:呃,请休息一下吧。三哥,看起来你的情绪已经恢复正常了,请继续往下补充吧。

ES3:呵呵,不好意思让大家笑话了。在我们家族里,我是出了名了脾气暴 + 脸皮厚,我五弟则正好和我相反,不过我们的关系很不错哦,而且我们都是很好很好的人儿,大家可以放心的。我家祖上为人比较低调,但其实是很有真才实干的,没多久就被 ECMA 吸收为永久正式成员了,时间大概是在 1997 年。也就是从那时候开始,我们有了自己的家族称号:ECMAScript。各位,虽然比起 ISO 来,ECMA 作为一个标准化组织名气略逊一筹,不过 ECMA 可是专门为计算机行当设定标准的官方机构哦!这世界上有多少脚本(Script)语言?相信诸位都数不清楚,但唯有我们家族是用 ECMA 冠名的,头牌!知道不?

n:那么请问五弟,今天看来 JavaScript 和 ECMAScript 到底有什么区别呢?

ES5:Good Question!很多程序员对此都不甚了了,但其实这个问题很重要,它决定着你是否能写出兼容 ECMAScript 标准的代码。说起来,差别还是蛮多的,不过最重要的一点就在于平台的纯粹性,或者说执行环境的纯粹性。如前所述,JavaScript 的命名是在生存在浏览器平台下的一个抉择,实际上浏览器这个生态环境是很复杂的,不仅仅有脚本语言——比如我们,还有基于对象的文档模型,也就是 DOM,另外还有编写文档用的标记语言——HTML,以及负责文档样式呈现的 CSS,等等。ECMAScript 在其中扮演着一个交互指挥员的角色,我们可以通过 DOM 提供的接口来操作 HTML,当然也可以操作 CSS 以及其他一些成员。因为大家认识我们是从浏览器开始的,所以很容易就把属于 DOM 家族的成员也视作是我们家族的一份子。虽说我们几家关系很亲近啦,但是血统终究是不一样滴~因此 JavaScript 更多地被用来笼统的称呼我们这几个家族在浏览器内所构成的生态环境,但 ECMAScript 则比较纯粹,是排它的,仅仅代表我们家族承认的,拥有相同血统的成员们。

ES3:说到这我不吐槽就不行了!乡亲们啊!多少年了!你们知道多少年了吗?我一直背负着 JavaScript 那恶心的兼容性所带来的一系列骂名!但是天可怜见啊!有些事情真的不是我的错啊有没有!!!一说起 JavaScript,你们就把矛头指向了我,可其实我真正能代表的,能负责的仅仅是其中的一部分而已哟!我们家族早在 1999 年就选举我作为现任族长,正式的语言标准摆在 ECMA 总部的案头都落了千层灰了有没有!!!可是浏览器的制造商们老是不按套路出牌,天地良心我为了这些破事上上下下,前前后后,求爷爷告奶奶协调了一万万遍了有没有!!!这能都怪到我头上吗?知不知道我夜夜失眠啊?知不知道我抑郁症晚期啊?你们这些程序员呀,就是 Too young, Too simple, Somtimes naive!!!

(观众狂嘘)

n:三哥三哥,请冷静,冷静!休息一会儿,休息一会儿,好吧?

ES5:(抹着泪)主持人,你也别生气,我三哥心里委屈啊!这些年他的确承担了太多太多了,这些苦别人不知道我知道。我四哥死得早,我年龄又小,之前家里的那些老人为了下一任家主的养成计划争执不休,三哥顶着重重压力硬是支撑着家族十几年。在我们面前,他从来都是一副大大咧咧,天不怕地不怕的样子,但是我们都注意到他的皱纹,他的白发,他那日渐伛偻不再挺拔的脊梁……哇~

n:呃……观众朋友们,实在抱歉,我也不想搞得跟央视艺术人生似的动不动就一哭二闹三上吊,可实在是预料不到啊!看来,每一个成功的伟大人生的背后都有着不堪回首的奋斗史,了解历史,回顾历史,以史为鉴也正是我们节目希望传达的价值之一。鉴于两位嘉宾现在深陷回忆,情绪失控,我们先休息一下,插播一段广告。请锁定太极客访谈节目,广告之后立刻回来!

表示没太明白这个“系列”是干嘛的,讲 javascript?我怎么觉得还是正经的那篇比较好啊,纯属个人意见。

#1 楼 @Blues 是的,讲 JavaScript。我明白你的意思,因为改写的这个只有半篇,没能把正经那篇全部改完,我是来看看喜欢严肃风格的和轻松风格的,哪一种更容易让人接受。

另外,不用担心干货的问题,这只是第一集,纯属热身,没有去探讨技术细节的打算。

#2 楼 @nightire 情景剧的台词,缺演员。。。

#3 楼 @liwei78 所以?你的感觉是可以接受,就是角色不够丰富?

#4 楼 @nightire 其实我也写了个类似形式的技术文章,但是自己觉得会偏离我想要表述的,因为,文字是没有“表演能力”的,如果太多的关注“情节”而忽视“阐述”,会让人有点晕。。之前有一本讲 SaaS 的书,用了金庸小说的人物,来表述不同的观点,我倒是想借鉴的。

我很接受你用的这种方式,以前一条条的罗列自己的观点,是很让人厌烦。

#5 楼 @liwei78 你说的正是我担心的,发展情节从另一个侧面来看就是会引入一些不必要的描述。增加趣味性和保持简练是一对很难平衡的矛盾呀。我还是得小心不要扯太远,谢谢。

第一次就出现太多太多没见过的名词是不是压力太大了点

#7 楼 @bhuztez 这么说也是……我也挺纠结的。原本第一篇是想讲一下关于严格模式的话题。为什么要 "use strict";?怎样使用它?它是怎样工作的?在现实中,特别是在较大规模的项目中如何正确的实施严格模式?

实际上严格模式的使用还是挺简单的,但是很多 JavaScript 程序员不喜欢用,或者说没有养成习惯去用它;而另一方面,这些 JavaScript 程序员又对一些新特性十分喜爱,迫不及待地要在自己的代码中去使用——然后,问题就来了:你如何确保自己尝试的新特性是可靠的?是能够满足项目开发所针对的目标客户端环境的?

本来严格模式的目的就是帮助程序员确保这一点,然而会用和善用严格模式却需要程序员对它的来历要有一定的了解。之前也提到过这个系列所涉及的每一个话题都是“对不求甚解者无爱的”,也就是说并非完全针对菜鸟和伸手党而撰写的保姆帖子。因此,你要讲的透,又要讲的简单而不枯燥,这的确有些难度。

请问大家,本篇中出现的这些名字会让大家感觉压力山大吗?如果会的话,那我要看看是不是还得阉割一些了。

#6 楼 @nightire 我们担心很一致,我往往对写的东西编辑上几次,删掉很多副词,合并一些句子。因为那些口语的东西不适合发表在正式文章上。 另外,我有个建议:莫让“屌丝情调“成为主流。文字可以幽默,调侃,甚至嬉皮,但是不要“屌丝”。这个词在东北绝对不是什么好话,而且我们也不必要去讨好世俗。

我回过头去重新读一下,和之前那篇相比,改写的这一篇的确在 JavaScript 的历史上扯得太多了,迟迟未能进入严格模式的正题,看来还是驾驭不足啊——得改。

#9 楼 @liwei78 OK,我明白你的意思,我也是有点放纵过头了,谢谢。

#11 楼 @nightire 可以加我 q 聊,如果你愿意的话。五要七五四八六

我喜欢正经简洁的。

内什么,五世按常理来说是不是应该是三世的孙子... 我觉得如果是写历史,直接第三人称调侃即可,这么写太散了,而且真的会让人 TL;DR...

期待一下👏

#2 楼 @nightire 讲历史的话,这种风格挺好,看你自己的行文风格了,你不可能取悦所有人的。 期待完篇。

写成文的东东加个“参考文献”部分如何?

類似這種風格,有本冒號學堂很不錯,可以看看。

楼上推荐的书我喜欢,谢谢啦。 我发现《ruby 元编程》的写作风格也很不错,书里引入 Bill 这个角色,让讲解的东西不那么枯燥。

很高兴看到 LZ 做出新的尝试,有时候冒冒险挺好的,可以领略自己从未感受过的风景. 但此文形式有些喧宾夺主,阅读起来就要比正儿八经的那篇费劲. 也许还需要再斟酌下,加油~

这个例子不怎么好,不管是戏谑版还是正经版本,都嫌篇幅太长太罗嗦太没有重点……

大概因为 "use strict";本身没啥好讲的,实践上一句话就结了:用 coffeescript 写,然后在每个用严格模式的文件开头加一句 'use strict'

用 coffeescript 写已经过滤了大部分问题,比如根本就写不出const,然后文件合并也不会出任何问题

还是喜欢正经的,想看看欢乐的我就去微博或者跟妹子聊天去了~ 想问一个无关的问题。你们也是用 Ember.js 对么?你们的 model 层是用的已有框架(ED, EM, EPF)? 还是自己封装 Em.Object 开发的?我是自己写的,最近被这个问题折腾得不轻……

#21 楼 @aptx4869 那你应该看看我正经的那篇,"use strict" 并非只是这么简单。

LZ 这是在挖坑往里跳。。。

挺好的,正好 javascript 是我的短板,期待 LZ 后续的文章

LZ 有才啊

#23 楼 @nightire 我回复里都说了

不管是戏谑版还是 正经版本

我还是解释一下为啥我觉得这篇文章写的不好,为什么用 CoffeeScript 就能避免遇到文章中说的那些坑吧……

写代码前,先想好(或约定好)要支持的 JavaScript 版本及执行环境;

这个原则太大其实跟 strict mode 没有直接关系,用不用严格模式都得这样

确保你所使用的任何 JavaScript 特性都是运行环境所支持的;

大部分严格模式和非严格模式上有兼容问题的特性,用 CoffeeScript 来写的话,要么根本不能编译通过,要么是写不出来,比如用const,with之类的保留字,比如未声明就赋值什么的,比如函数参数重名什么的,比如对象 key 重名什么的……别说严格模式,就连function foo()这样可能遇到浏览器兼容问题的函数声明,都没法写出来,只能写出var foo = function()这样的……

总是在兼容 ES5 的执行环境下测试开启严格模式的 JavaScript 程序;

这点说了跟没说一样……实际上不会遇到这个坑, 实际上不兼容 ES5 的主流浏览器只剩下低版本 IE,难道你认识有只用 IE 做调试的奇葩么,就介绍……然后 CoffeeScript 没有涵盖到的严格模式可能出现的剩下那些问题,在现代浏览器上调试的时候也会显式报错的

小心处理文件合并时对于严格模式可能造成的各种影响及后果。

CoffeeScript 编译出来的文件自带闭包,想因合并顺序出问题也出不了……

所以我才说用 CoffeeScript 基本能避免那些坑…… 你看人家 Github JavaScript Styleguide 第一条就是

Write new JS in CoffeeScript.

#27 楼 @aptx4869 我想你忽略了一个很重要的前提,那就是你假设所有看文章的人都像你一样明白这背后的道理,这恰恰是我们撰写这个系列的目的。你明白就能代表其他人也明白吗?

关于 CoffeeScript 的问题,我们就没有打算谈及 CoffeeScript,我们只是在讨论 ECMAScript 里的特性,无关于用什么方法写。我当然知道使用 CoffeeScript 有诸多好处,我也知道 CoffeeScript 现在大受欢迎,但是你应该明白 ECMAScript 是标准,但 CoffeeScript 不是,我不可能在这样的一篇文章里对大家说:别问我上述哪些问题的答案是什么,一句话——用 CoffeeScript。

我说的是严格模式自身,你说的是 CoffeeScript 可以避免严格模式所带来的坑,这其实根本就是两个话题。你所推荐的 CoffeeScript 可以作为一个很好地补充,或者说进阶阅读,但不能直接替代开发者对于严格模式的学习和理解过程。CoffeeScript 就像一个黑盒,帮助大家把这些问题隐藏起来,像你这样知道其所以然的当然觉得大题小做,但还是那句话:你明白不代表大家都明白。

或许你所在的团队人人都用 CoffeeScript,这当然是好事,但还有太多同行企业的程序员们(后端出身)连基本的 JavaScript 都写不好。尽管 CoffeeScript 很好,可是你极力推荐人家却未必愿意或者能够接受。更不要说还有多少项目存活在 <= IE9 的环境下,你知道升级浏览器之后要处理多少 Legacy Code 吗?

我写的的确不好,我正在反思和修改中,但并不是你说的这些原因。Anyway, thanks for your feedback.

匿名 #29 2013年11月08日

movl this,[瞎扯淡]

要不把这个写到 RPG 文字小游戏里面?

翻出来顶一个:)。 BTW,还有后续么?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号