龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

JavaScript的死与生(1)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
JavaScript 很流行,但它有 先天缺陷 。Brendan Eich 当初只花了10 天时间就把 JavaScript 设计出来了,作为 JavaScript 之父,BE 如是说: 与其说我爱 JavaScript,不如说我恨它。它是 C 语言和 Sel

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

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

(摘选自阮一峰的翻译:JavaScript 诞生记)

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

糟糕冗长的语法

可选参数和默认值

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

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

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

注意: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   
  2. var element = elements[i];  
  3. LIB_addEventListener(element, 'click'function(event) {  
  4. alert('I was originally number ' + i);  
  5. });  

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

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

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

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

模块

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

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

如果原生支持该多好呀:

  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. (function() {  
  17.  
  18.   import event;  
  19.  
  20.   // ...  
  21. }()); 

继承

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. Employee.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 position = 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 多年后,再用上这些好用的语法吗?

精彩图集

赞助商链接