重思JavaScript的JavaScript

移动开发
一个只花了10天就开发完成的脚本语言,自从诞生开始,就一直成为人们争论的焦点。尽管这样,它在编程语言中地位仍然无法动摇,全世界有几百万学习者和粉丝。

最近,我和许多程序员一样,对JavaScript进行重新探讨。事实上,JavaScript是一个非常有能力的语言,但使用新JavaScript一年后,我得出的结论却是JavaScript仍然很烂。我并不是在讨论其古怪的比较运算。而是从更深的层次去思考。与此同时,还会提供一些解决方案供你选择。


 

[[106567]]


 

直奔主题

13岁时,父亲送给我第一本编程书籍——JavaScript初学者编程。让我兴奋的是,我发现电脑并不单单是由电线和发条所组成,里面的代码清晰明了。我觉得我基本上理解它了,实际上也差不多。终究,代码除了人类理性思想的形式化还能是什么?

说实话,我当时希望遇到的是Java,我甚至在谷歌上搜索:“JavaScript和Java是同一种语言吗?”当然不是。所以Java成为了我学习的第二门语言,不过我母亲和继父不希望在家庭电脑里安装软件,所以我无法安装Java编译器。我清晰地记得,在把代码上传到一个在线编译器之前,得反复检查代码,然后等待、下载jar包……

我当时认为,JavaScript是一个非常严肃的语言。在Notepad里新建一个HTML文件,然后在IE里打开,就这样开始了。没有类、没有私有和公有方法,没有final变量。当时,我甚至不知道什么叫“过度设计”,但它准确地描述了我印象中的Java:

  • 无需编译
  • 无处不在的开发平台
  • 没有高级语言特性
  • 查看源文件

为什么这么伟大的语言还会讨人厌?

Ad-hoc地狱

下面是一些问题:设计之匆忙、初衷仅仅实现简单的网页互动、JavaScript继承完全缺乏设计指导,一切都是ad-hoc:

  1. 没有OOP:JavaScript确实存在基本的对象模型,但几乎无人知道它是如何工作的。
  2. 没有标准库:从论坛上复制粘贴代码不好玩。
  3. 没有模块系统:不断查找下载链接和很长的源文件。
  4. 缺乏语言资源:没有高品质的资源(几乎没有一本像样的书籍)意味着你只能从论坛或博客上获得一些非官方的参考。

既然JavaScript有这么多缺陷,到底是什么让它如此流行?

复兴

JavaScript崛起的背后可能与谷歌V8引擎息息相关。JavaScript突然变得很快,真正地快速。所以人们开始硬着头皮使用它来编写Web应用程序。

然而,Node.js推出了一些更吸引人的基准,允许代码在客户端和服务器端重用,很像MeteorDerby。因此,情况开始好转:

  1. 下载按钮变得更大
  2. Node.js kind of sort of standardized an import system
  3. 人们可以编写更好的库
  4. 优秀的资源开始出现

然而:

  1. 仍然没有采用OOP
  2. 客户端和服务端的JavaScript仍然没有关联
  3. 文档甚至是高知名度项目文档也很糟糕

为什么?

我认为现代JavaScript仍然较烂的根源是其处在一个特定的社区氛围中,该氛围一直强调:JavaScript是一门非常好的语言,但却一直被人误解。不,JavaScript只是一个提早诞生且没有先例可循的语言。停止包庇并且开始把JavaScript作为一个平台去拥抱,作为一个编译目标。

文档

人们可以尽情嘲笑Java,但当我看Java文档时,我可以非常明确地知道哪个对象可以创建、每个方法里的参数、需要抛出的异常等。最好的事情莫过于使用JavaScript库作为精选示例代码。这几乎是不可能写出正确的软件,除非你阅读库源码。甚至连如此完整的JavaScript项目Express也存在令人生厌的API文档(Ember他们那些非常优秀的API文档可能是反例)。

语法糖

JavaScript社区很快就抛弃了语法糖。语法糖是极富创造力的。将重复逻辑代码抽象出来,可以通用,帮助程序员以更好的方式编写代码。

  • 让代码更加简洁
  • 有助于表达代码背后的意思,而不是算法。我已经知道了数组迭代算法,好吧,谢谢你,但是请你不要告诉我这些,我只想知道你要做的东西。

作为一名编码人员,你的主要观众不是电脑,而是其他程序员,也包括将来的自己。书写冗长的for循环很爽,但说实话,for (var i=0; i<arr.length; i++)与for e in arr 比起来,人们更愿意读后者。顺便说一下,这里的JavaScript版的循环比CoffeeScript速率要慢,你知道为什么吗?

JSLint

如果程序员使用JavaScript尚未感到痛苦,那JSLint成功做到了这点,而且非常“成功”! 想象一下,在某个编码的新兵训练营里,想要对JavaScript进行尴尬的惩罚,然后在其身上进行拔毛,这好比是拿着牙刷在刷厕所。事实上,我宁愿从牦牛身上拔毛。这是原文中的例子,小编的理解是JSLint的出现是给JavaScript挑刺的,而这样还不如直接在JavaScript身上拔毛。


 

[[106568]]


 

更值得注意地是,作为程序员,我们应该寻找自动化,难道你不希望自己可以自动化JSLint吗?当然,你可以。CoffeeScript可以***的生成linted代码,正如Jeremy。

OOP

JavaScript对象模型还是不够成熟,原型(Prototype)继承是一个低级别的功能,可以创建一些非常有意义的对象模型,但却无法基于本身进行构建。

这也可能是JavaScript API为什么会那么糟糕的原因,当你所使用的语言甚至没有类时,该如何记录面向对象代码呢? 最重要的是,当我们甚至不知道实例化对象时,JavaScript开发人员该如何实行互操作?

有什么可选项吗?

年复一年,笔记本逐步成为主流、政坛也发生了不少的变化,而JavaScript仍然保持不变。你愿意等一些基本特性多少年?在这篇悲观论调的文章里,让我们先看看下面这个列表:

  1. Mozilla发布了自己JavaScript1.7或1.8,前者是在6年半之前发布的,且不向后兼容,但并无人使用且永远不会有,同样也适用于后者。
  2. ECMAScript Harmony。最近,由于设计委员会的原因,发布新版ECMAScript将会有一个极其缓慢和痛苦的过渡过程,特别是它有一些特效是与JavaScript不兼容的。没有解决方案,除非你愿意再等数十年。

下面列出一些可选项

  1. CoffeeScript语法非常漂亮且支持类。我认为CoffeeScript并未结束,只不过是刚刚华丽地开启。
  2. TypeScript一种编译到JavaScript的语言,可以在JavaScript中构建并且添加了静态类型。个人而言,我是它的大粉丝。正如Mohamed Mansour和Dave Hodder在评论中指出的那样,TypeScript正在进一步实施ECMAScript的一些建议,也许ECMAScript最终会从TypeScript中借鉴可选的静态类型。
  3. Google Dart一个全新的语言,附带JavaScript编译器和一些JavaScript互操作,但整体上并未整合到JavaScript生态系统中。
  4. HaXe这是一个高级语言,可以编译JavaScript、Flash、NekoVM、PHP、C++、C#和Java(不久后),虽然我从未使用过,但它真的令人印象深刻。

总结

***,我敢押注,最终的获胜者肯定是编译为JavaScript的语言。虽然我们还没真正准备好这样的过渡,但是所取得的进展仍是有目共睹的。尽管也存在些偏离,但他们正在替未来的Web发展铺平道路。不管最终哪门语言会胜出,我都想强调一下我的主要观点:JavaScript目前仍然存在许多不足,我们需要拥抱一个新语言并且推进它。

责任编辑:冰凝儿
相关推荐

2012-08-10 10:15:50

HTML5

2015-08-11 09:46:26

JavaScriptDOM编程重排

2011-05-25 14:23:55

Javascriptthis

2014-03-11 23:10:35

JavaScriptJS

2011-10-20 15:56:07

Dart

2021-05-14 00:00:15

JavaScript开发代码

2011-05-25 10:03:00

JavaScriptwith

2015-07-20 16:41:16

MongoDBJavaScript

2013-04-07 09:57:45

CouchbaseMySQLNoSQL

2018-01-03 13:06:13

JavaScript成本开发

2021-04-07 10:12:05

Javascript对象拷贝开发

2014-01-03 09:13:39

JavaScriptthis

2009-06-09 22:07:24

Javascript缺

2009-07-14 14:12:14

Javascript

2012-12-18 10:03:22

JavaScriptWebJS

2013-05-08 10:36:07

JavaScriptJS详解JavaScrip

2011-08-10 10:27:47

思杰XenServer 6

2009-06-09 21:54:26

传递参数JavaScript

2011-07-19 13:29:50

JavaScript

2019-11-06 09:52:01

JavaScript单线程非阻塞
点赞
收藏

51CTO技术栈公众号