【评论】JavaScript的死与生

导读:本文根据《JavaScript is Dead. Long Live JavaScript!》这篇文章翻译而来。

文章内容如下:

JavaScript的成功得益于在正确的时间出现在正确的地点。JavaScript的兴起与浏览器的支持息息相关。你瞧,VBScript就没这么好运气。

JavaScript很流行,但它有先天缺陷。Brendan Eich当初只花了10天时间就把JavaScript设计出来了,作为JavaScript之父Brendan Eich如是说:

与其说我爱JavaScript,不如说我恨它。它是C语言和Self语言***的产物。十八世纪英国文学家约翰逊博士说得好:“它的优秀之处并非原创,它的原创之处并不优秀。” 

JavaScript的不足,最明显之处是语法。

糟糕冗长的语法 可选参数和默认值 


  1. function(a, b, option) {  
  2.   optionoption = option || {};  
  3.   // ...  

上面的代码中,option是可选参数,当没有传递时,默认值是{}.然而,传递的option值有可能是假值(falsy值)。严格来写,得如下判断:


  1. function(a, b, option) {  
  2.   option = arguments.length > 2 ? option : {};  
  3.   // ...  

注意:option = typeof option !== 'undefined' ? option :{}也有可能是错误的,因为传递过来的可能就是undefined。当不需要b参数,删除后,基于arguments.length 的判断很容易导致忘记修改而出错:


  1. function(a, option) {  
  2.   option = arguments.length > 2 ? option : {};  
  3.   // ...  

如果能增加以下语法该多好呀:


  1. function(a, b, option = {}) {  
  2.   // ...  

Let

闭包很强大,也很恼火:


  1. for (var i=0, ilen=elements.length; i<ilen; i++) {  
  2.   var element = elements[i];  
  3.   LIB_addEventListener(element, 'click', function(event) {  
  4.     alert('I was originally number ' + i);  
  5.   });  

上面的代码经常在面试题中出现,解决办法是再包裹一层:

for (var i=0, ilen=elements.length; i<ilen; i++) {  var element = elements[i];  (function(num) {    LIB_addEventListener(element, 'click', function(event) {      alert('I was originally number ' + num);    });  }(i));}

如果直接支持let语法该多好呀:

for (var i=0, ilen=elements.length; i<ilen; i++) {  var element = elements[i];  let (num = i) {    LIB_addEventListener(element, function(event) {      alert('I was originally number ' + num);    });  };}

模块

模块模式是一种无奈的选择:

如果原生支持该多好呀:


  1. module event {  
  2.  
  3.   // private variables  
  4.   var listeners = [];  
  5.  
  6.   export function addEventListener(f) {  
  7.     listeners.push(f);  
  8.   }  
  9.  
  10.   export function clearEventListeners() {  
  11.      listeners = [];  
  12.   }  
  13.  
  14.   // ...  
  15. }  
  16.  
  17. (function() {  
  18.  
  19.   import event;  
  20.  
  21.   // ...  
  22. }()); 

继承

JavaScript要通过原型链来实现继承:


  1. function Employee(first, last, position) {  
  2.   // call the superclass constructor  
  3.   Person.call(this, first, last);  
  4.   this.position = position;  
  5. };  
  6. // inherit from Person  
  7. Employee.prototype = Object.create(Person.prototype);  
  8. EmployeeEmployee.prototype.constructor = Employee;  
  9.  
  10. // define an overridding toString() method  
  11. Employee.prototype.toString = function() {  
  12.   // call superclass's overridden toString() method  
  13.   return Person.prototype.toString.call(this) +  
  14.          ' is a ' + this.position;  
  15. }; 

如果能写成下面这样该多好呀:


  1. class Employee extends Person {  
  2.   constructor(first, last, position) {  
  3.       super(first, last);  
  4.       public positionposition = position;  
  5.   }  
  6.  
  7.   update(camera) {  
  8.       return super.update() + ' is a ' + position;  
  9.   }  

感悟

ECMAScript委员会已意识到JavaScript在语法层面上的不足。在Harmony规范中,以上所有语法均已提案。

我们什么时候才能使用以上语法呢?

只要有宏(Macro)

Lisp语言的宏特性非常强大。通过宏,你可以根据自己的喜好定义想要的语法格式。宏特性使得Lisp成为一门“可编程的编程语言(the programmable programming language)”.

JavaScript没有宏。给类C语言添加宏特性,目前依旧是个研究课题,很有难度。

只要有宏,我们就可以自定义语法。但JavaScript的宏特性遥遥无期,还是找找其他路子吧。

Harmony

Harmony规范里的语法扩展,可能是我们所有人的梦。Harmony有可能成为ECMAScript 6规范。在这之前,我们需要等待,耐心等待。

截止2011年5月,w3school显示IE6的市场份额还有2.4%。Net Market Share 显示IE6占有10.36%市场份额。还有IE7的市场份额也不少。这些老旧浏览器短期内不会退隐市场,对于商业公司来说,比如Amazon,不可能放弃这批用户。糟糕的现状。(中国大陆更惨,IE6/7还占有40%多市场份额)

我们不能寄期望于“IE该死”这类呼吁来让用户升级。听到过一种说法:IE用户仅会在更换电脑硬件时,才升级浏览器。悲催的是,对于普通用户来说,收email,上Facebook,Twitter,现有的硬件已足够。没有理由让他们去花一笔钱。

Goggle Apps最近宣布,从2011年8月开始,将停止支持IE7.

通过各种保守估计,Amazon的网站开发者,用上Harmony语法扩展,要一直等到2023年!

风华正茂的你,愿意等待10多年后,再用上这些好用的语法吗?

JavaScript已死

死因:分号癌。(semicolon cancer.作者的调侃,意指语法导致JavaScript死去)

通过上面的分析可以看出,宏特性实现太难,Harmony规范的实现则遥遥无期。大量程序员开始书写JavaScript,其中有很多人已经厌倦或开始厌倦JavaScript冗长糟糕的语法。我们需要新的语法,我们不想等待!JavaScript,作为源码编写语言,已经死了!

JavaScript先生,你曾有过辉煌的统治。我们与你,有过甜蜜的回忆,一起产出过很多有趣的应用。祝福逝者安息。

JavaScript长存

程序员喜欢掌控自己的命运。作为源码编写语言,JavaScript已死。我们可以选择或创造另一种更好的源码语言,将其编译成ECMAScript 3的语法格式。

JavaScript的新生,是作为编译目标(compilation target)。

编译成JavaScript的语言

能编译成JavaScript的语言有很多。我在1997年时,收集过一份列表。包括:

  • JavaScript扩展语言:已死的 ECMAScript 4, Narrative Script, Objective-J.
  • 已存在的语言:Scheme, Common Lisp, Smalltalk, Ruby, Python, Java, C#, Haskell等。
  • 还有一些崭新的语言:HaXe, Milescript, Links, Flapjax,专门为web 编程而设计。

在这些编译器项目中,Goggle的GWT Java-to-JavaScript编译器有可能是最成功的一个。然而悲剧的是,现实项目中,很少看到GWT的身影。原因如下:

1.维护成本很高。编译器可能有bug.假设你在一个大型项目中,发现了编译器的一个bug,作为维护者,除了维护源码,你还得维护编译器。天哪,你有这个本事吗?你有这个本事,CEO也不愿意花这个钱呀。

2.调试麻烦。Firebug报了一个错,报的是编译后的行号。老板站在你背后:赶快啦,小伙子!可是这该死的编译后代码,究竟对应哪一行源码呀?

3.招聘不到人。假设你使用Objective-J开发一个项目,但人手不够。赶紧招人,HR说1000个人里面,只有100个听说过Objective-J,另外900个只听说过JavaScript.结局是你每找一个新人,都得先培训一把,真是糟糕透顶。

虽然编译器有以上各种不是,但各种编译器依旧如雨后春笋大量涌现。毫无疑问,编写JavaScript编译器非常酷。给我报酬,我也想写一个。

在上面的编译器列表中,有一个非常有名的引起过很大轰动的:CoffeeScript。我们来谈谈它。

时间: 2024-09-20 10:30:56

【评论】JavaScript的死与生的相关文章

互联网掌控音乐死与生:2亿硬通货 毁灭者与守望者

"免费"模式曾重创了唱片行业,如今,曾经的毁灭者正在变身为守护者.只是,对于收费的目的,艺人.唱片公司.互联网公司大相径庭宋柯离开了.他是中国著名音乐人,高晓松的师哥,捧红叶蓓.老狼.朴树,第一个签下李宇春.2012年初他撇下苦心经营的太和麦田音乐公司,开了家烤鸭店.临走时,悲怆地在微博抛下一句"音乐已死".宋柯宋柯又回来了.他的新身份是恒大音乐董事总经理.如果他预料到有人会让音乐收费"复活",可能他当初就不会走.近期有消息称,QQ音乐.百度音乐

温州购房门最早曝光帖的死与生

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅                                                                                                           帖子被恢复后仅两个小时,访问量就从153上升到4066,回复量从0上升到56(腾讯科技频道配图) 被删除24天后,最早曝光温州官员购

Javascript 中的长字符串拼接

Javascript 中的长字符串拼接 2011-07-11 16:00 佚名 互联昂网  字符串拼接是所有程序设计语言都需要的操作.当拼接结果较长时,如何保证效率就成为一个很重要的问题. C 语言的 strcat 函数直接操作内存,效率自然最高:C++ 的 string 类是可变的,本质上也是直接操作内存,效率也不在话下:Java 的 String 类不可变,字符串拼接意味着产生新对象,因此提供了专门用于字符串拼接的 StringBuffer 类,也保证了执行效率. 在 Javascript

javascript无刷新评论实现方法_javascript技巧

本文实例讲述了javascript无刷新评论实现方法.分享给大家供大家参考.具体实现方法如下: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无刷新评论</title> <s

营销的利器之评级和评论

网上交流,不管是和我们熟悉的朋友还是那些喜欢分享自己购物经验的人们,毫无疑问,电子商务现在已经很社会化了.而这篇演说报告就是讨论的网上营销的利器--评级和评论,评论工具是一个很完美的顾客和商家双赢的很好的例子:顾客赢了是他们做出了正确的选择并对自己的购物决策感到更加自信;零售商和品牌商赢了,因为开心的顾客成为了他们最得力的售货员,也让顾客间的交流和顾客满意度变得更好.到底是怎么获得更多的可信评论呢?我们怎么从这些优质内容中谋取最大利润呢? 你要知道,现实是残酷的,大部分零售商或品牌商们并没有把这

GitHub上最流行的Top 10 JavaScript项目

统计出Github中所有项目的数量,几乎是不可能的,而明确指出哪些是最优秀的项目就更不可能了.如果说到JavaScript,曾经极富创新的项目(很可能)在一两个月后就会变得过时.落后.以防被淹没在大量的项目中,去研究(哪个项目更好),我们可以来看看2016年Github上最热门的Javascript项目. Vue.JS Vue.js是2016年的赢家,收获了25000多个star,甚至完胜React和Angular.它是一个渐进式.开源的框架,用来构建UI.它的核心库仅专注于视图层,这使得Vue

知乎创始人周源:如何赚钱

摘要:用户在生活方面上产生的各种场景和需求,知乎是感受不到的,因为你并不是在那些产品之内,可能看不到大量的变化,只能从外部去感受. 创始人周源说,知乎的未来是什么 "作品感"是创业公司唯一的文化 "我接触到的大部分创业公司,包括我自己,还是缺乏常识.你得尊重商业.很多人是不尊重商业的,可能在产品上想得很多,但是你不能一点商业都不懂,天天想着到了某一天天上掉馅饼下来,就自然水到渠成了,这是不可能的." 上周五晚上在知乎公司边上的一家餐厅里,知乎 CEO.联合创始人周源

[译] 高性能 React:3 个新工具加速你的应用

本文讲的是[译] 高性能 React:3 个新工具加速你的应用, 原文地址:High Performance React: 3 New Tools to Speed Up Your Apps 原文作者:Ben Edelstein 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:sunui 校对者:yzgyyang.reid3290 通常来说 React 是相当快的,但开发者也很容易犯一些错误导致出现性能问题.组件挂载过慢.组件树过深和一些非必要的渲染周

各学科领域入门书籍推荐

看到果壳问答里有人要求推荐各学科入门书籍,想起以前正好做过类似的工作. 是在2009年的时候,集合了科学松鼠会和豆瓣的网友,一起推荐了这些书. 当时的要求是:"先写下你的专业领域,再回答这个问题'如果一个受过高中教育.但完全不了解你这个领域的人想学习之,你推荐哪本入门书籍?'".大量网友参与,最后总结了以下这些书.不过,最后列出来的书籍,恐怕不完全是高中水平能掌控的,也难怪,不是所有领域都能轻易入门的. 所以,最后我将这个列表定义为:"对想了解某个领域的初学者来说最值得推荐的