`
hax
  • 浏览: 965159 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JavaScript的未来方向之观察

    博客分类:
  • JS
阅读更多
最近每次去杭州,都有爱民做东道,这次吃羊排不亦乐乎。席间不免聊起技术话题,爱民问我对JavaScript的未来方向的看法,特别是像Class、Inheritence等静态特性是否会引入语言?

这确实是一个令人关心的问题。很长一段时间以来,ES4的难产和分歧让人始终对JavaScript的未来感觉蒙有一层面纱,即使ES5.1都已经发布,我们仍不免心存疑虑。

不过,根据我的观察,从ES5所做的语言的改进,到Harmony的一些草案,加上一些JS社区领军人物的blog和speech作为印证,都证明JavaScript的未来方向已经是比较明朗的。

任何一门语言的演化都是一件困难的事情,特别JS这样一门已经10年历史的语言,而且是Web的唯一编程语言,其历史包袱是很重的。所以不难得出这样的原则:在修复bug和引入新特性的同时必须保持实践上的兼容性。此外,在标准制定上参考和吸取社群的实践经验已经成为了共识。对于JS语言来说,可资参考的,比如CommonJS,比如各大前端JS库,比如Coffeescript,比如Python/Smalltalk/Ruby等其他语言。


具体来看ES的发展方向大概是以下三个方面:


1. API扩展。如JSON、数组上的forEach等迭代方法、RegExp的增强等。这个部分相对比较简单,主要是从厂商标准(特别是Mozilla的JavaScript扩展),一些事实标准JS库(如JSON)中吸取API,不赘述。


2. 使得ES成为一种真正的通用编程语言,而不是仅仅依附于host环境的脚本语言,最主要就是取消host/native对象的分野,让ES本身也可以实现平台对象(比如DOM接口)。

ES5在这方面的努力是加入了get/set accessor以及Object.defineProperty等一系列特性。

在此之前,开发者是无法做出类似innerHTML这样的属性接口的(除了使用厂商特定的扩展)。开发者也无法控制属性是否只读、是否可枚举、是否可删除(一个直接后果是对Object.prototype的扩展成为了一个罪大恶极的举动)。ES5弥补了这方面的缺陷。

不过这只是第一步。仍然有一些host接口是无法实现出来的,例如类Array的接口(各种Collection的下标存取),或可动态变化的接口(比如localStorage/sessionStorage接口)。

而Harmony引入了Proxy(动态代理),提供了完整的元编程能力。由此,几乎所有的host对象接口都可以直接由JavaScript实现出来。【Proxy的强大当然不止于此,另文阐述。】也就是说,这让JS开发者,特别是JS库的开发者获得了与平台(浏览器)提供商同等的能力。可以想象,在拥有这样的能力之后,库的发展和创新会进入一个新的阶段,我们(JS开发者)完全不必受制于平台提供商(那些Bottleneck的C++程序员们!)并且它能反过来推动平台API和标准API的演进。

Harmony(以及HTML5相关标准)引入更多类型如整数、二进制数组等,也可视为属于这一方向的努力。


3. 适应于programming-in-the-large的(PITL)需要。这包括去除一些语言陷阱【对于小规模编程,规避语言陷阱比较容易,但是在PITL,语言陷阱的危害就可能很要命】,提供“防御性”编程的支持,提升语言的鲁棒性,加强复杂度的管理能力。

一个例子是ES5引入了Object.freeze()/seal()等方法。这使得保持invariants约束成为可能,这对于大规模编程的帮助是非常大的。

ES5的strict模式也主要是为这个目的而生。因为要保持向前兼容,所以有些明知道是有问题的特性无法剪除。为此,引入strict模式。strict模式实际上是一个更鲁棒更安全更易于分析(因此开发工具可提供更多帮助,性能也有更大优化可能)的语言子集。

不过strict模式基本上是一个只做减法(以及fix一些错误)的方式,这样的好处是最大限度的保持了语言的统一性,语言委员会的成员也能很容易达成一致。坏处是提升仍然不够。例如strict修复了ES3在lexical scope上的漏洞(包括全局变量曝露、with、eval("var ...")等),或者说是剪除了好玩但危险的dynamic scope特性。但是ES5-strict仍然不够lexical,那就是var仍然只是function scope,而没有block scope。这导致一些常见的陷阱(如for循环里的closure如果需要引用单次循环中产生的对象,必须引入额外一层function)。这个问题留待Harmony去解决,即引入let/const。

Module、类和继承、可见性控制等特性都属于PITL的需求。从目前情况来看,这些特性将来一定会有,问题是只是以何种形式实现

所以回到爱民的问题,我认为,问题的核心并不在于这些特性是否更靠近“静态语言”,而是这些特性是否有助于PITL(programming in the large)。如前述Proxy特性实际是非常动态的特性,但是也有助于PITL(比如元编程使得更容易创建DSL,而DSL对于问题域的抽象提升显然有助于PITL)。Traits特性也是一个首先在诸如smalltalk这样的动态语言上试验的新特性,但要引入ES的原因也可归结为PITL需求(比传统多继承和mixin更好的OO形态)。

还有就是语法的改进。在有些草案里,类不过就是语法糖(也就是特定命令序列的“声明式”化或者说静态化)。虽然在PITL中,局部的语法因素通常不是最重要因素,但好的语法能更好的呈现语义,减少语法噪音,提高代码可读性,并连带提高代码可维护性和编程生产率,编程规模越大这方面累计的效果就越大。


最后,必须承认,在面对众多精彩纷呈的harmony提案和strawman草案时,我也深感眼花缭乱,力不从心。不过历史的车轮是不可阻挡的,JS的进化是必然的,JS开发者只有保持一个开放的心态,主动去了解和学习新技术,才能在即将到来的新潮流中游刃有余。




18
9
分享到:
评论
5 楼 步青龙 2012-02-20  
hax 你的Javascript果真真是不一般啊
4 楼 houfeng0923 2011-07-20  
进来顶一个,楼主的博客值得多来看看。
3 楼 hax 2011-07-12  
@庄表伟
这也不是第一天的事情了。自从当年拍出一个大砖以来,我每次发表新文章,都有人马上来踩,啊哈哈。
2 楼 庄表伟 2011-07-12  
hax,你在JavaEye的人缘有问题啊。。。
1 楼 limu 2011-07-12  
好文章,进来顶下,顺便催熟一下Proxy的详细介绍,严重期待这个.
结果发现3个踩...呵呵

相关推荐

    xeyes-headtracking-js:Xeyes 2.0(javascript 和头部跟踪)

    在网页上,这个项目可以使得网页上的"眼睛"跟随用户头部的移动而转动,仿佛在实时观察用户的视线方向,创造出一种富有生动感和趣味性的互动效果。这个项目的核心在于通过JavaScript来捕捉和处理头部运动数据,并将其...

    CoCreate-iframe:香草javascript中的一个简单的iframe组件。 使用HTML5数据属性和_或JavaScript API轻松配置

    路线图如果您对这个项目的未来方向感兴趣,请查看我们的未解决问题并提出要求。 我们很乐意倾听您的反馈。 关于CoCreate-iframe由CoCreate开发人员体验团队提供指导和支持。 如有任何疑问,请在此处发送电子邮件给...

    编程语言排行榜

    C++是否能重新夺回季军位置,还需要观察未来几个月的发展情况。 #### 五、Google编程语言的现状 Google推出的Go语言和Dart语言在排行榜上的表现平平。Go语言虽然设计简洁高效,但在2012年的排名中未能进入前50名。...

    html5前端小游戏-2048益智游戏

    玩家需要运用逻辑思维,观察当前布局并预测未来可能的合并情况,来制定最佳的移动策略。 项目结构方面,代码示例展示了HTML页面的基本结构。`index.html`文件包含了游戏的HTML元素,如按钮、分数显示以及4x4的方格...

    ?????? ?? ????? ???????? ??????_coding_

    在编程语言的历史长河中,我们可以观察到许多类似“法西斯主义”般强大的编程范式崛起和衰落的过程。某些语言因为其独特的优势迅速普及,但随着时间的推移,新的挑战者不断涌现,旧的语言要么适应变革,要么逐渐被...

    基于WebG的3D家居设计与展示.docx

    - **未来家居与智能家居方向**:考虑到未来家居发展的趋势,本系统鼓励参赛队伍在设计时考虑未来家居和智能家居的发展方向。例如,可以通过虚拟现实(VR)、增强现实(AR)或是混合现实(MR)等技术手段来模拟未来的...

    gen6-meta-history:全球链接使用统计报告的 VGC 2015 元记录历史记录

    总的来说,“gen6-meta-history”为我们提供了一个观察JavaScript历史演变的独特视角,展示了它如何成为连接全球用户的核心力量。这个项目的分析不仅有助于我们理解过去的技术趋势,也为未来Web开发的方向提供了启示...

    JobsForCodersMap:可通过github.jobs获得的开发工作地图

    因此,对于关注JavaScript的开发者来说,JobsForCodersMap不仅提供了便利的求职途径,还能够帮助他们了解全球JavaScript岗位的分布趋势,从而调整自己的学习方向和技能提升计划。 在使用JobsForCodersMap时,用户...

    Dual-Axis-Illusion:2019年度最佳幻觉-冠军

    这种幻觉的独特之处在于其同时绕水平轴和垂直轴的旋转,导致观察者产生一种违背直觉的视觉体验。这种现象挑战了我们对物体运动感知的认知,并为理解视觉神经科学提供了宝贵的实验素材。 该幻觉的实现主要依赖于...

    H5翻书效果,非常实用、

    2. **CSS3透视**:通过perspective属性,可以为元素设置一个观察点,从而产生3D空间的感觉,使得翻页效果更有立体感。 3. **JavaScript事件处理**:通过监听用户的点击或拖动事件,可以控制书页的翻转方向和速度。...

    SimpleRadar:分布式团队的简单技术雷达

    2. **可视化展示**:通过环形图,团队成员可以直观地看到各个技术的采纳阶段,理解它们在团队中的地位和未来方向。 3. **协作与分享**:作为一个团队工具,SimpleRadar鼓励成员间的讨论和协作,同时也可以将雷达图...

    南通的JAVA自学之路(加精).

    文章中给出了一份详细的Java自学路线图,覆盖了J2SE、数据库、JDBC、HTML_CSS_JAVASCRIPT等多个方向。这是非常系统和全面的学习计划,适合初学者按部就班地进行学习。 - **J2SE**:从面向对象的基础概念入手,逐渐...

    Three.js实现的三维城市和穿梭的光线动画场景特效源码.zip

    穿梭的光线可能指的是光线在城市结构之间快速移动,营造出一种未来感或科幻感。 【标签】"js" 指出这个项目是基于JavaScript编写的,JavaScript是一种广泛使用的脚本语言,尤其在网络开发中,它用于控制网页的行为...

    SimpleRaycaster:实现简单的光线投射引擎

    光线投射引擎是一种在计算机图形学中用于模拟光在虚拟环境中的行为的技术,它通过发射虚拟光线并...通过深入理解和实践,你可以掌握更多关于计算机图形学和JavaScript编程的知识,为未来的3D图形应用打下坚实的基础。

    行业文档-设计装置-一种图形旋转教学工具.zip

    6. **未来发展方向**:随着AR(增强现实)和VR(虚拟现实)技术的发展,此类教学工具可能进一步升级,通过三维空间的旋转体验,使学习更加生动立体。 总结,"一种图形旋转教学工具"旨在通过创新的交互方式,提升...

    国际软件设计大赛优秀参赛作品展示

    国际软件设计大赛是全球范围内备受瞩目的科技盛事,它汇集了世界各地的创新思维和...通过深入研究这些作品,无论是参赛者还是观察者,都能从中汲取宝贵的经验,提升自身的技术水平,并为未来软件行业的繁荣做出贡献。

    网络安全视角下的人工智能

    ### 知识点一:网络安全视角下的人工智能现状及背景 #### 现状与媒体热度 - **媒体关注度**:近年来,...通过对现状、背景、应用方向和未来趋势的深入探讨,我们可以更好地理解这一交叉学科的重要性和发展方向。

    使用HTML5技术开发的3D相册

    四、未来发展方向 随着Web技术的不断发展,HTML5 3D相册可以结合虚拟现实(VR)和增强现实(AR)技术,提供更沉浸式的浏览体验。同时,AI技术的应用,如自动识别和分类图片,也可能融入到3D相册中,使用户管理大量...

Global site tag (gtag.js) - Google Analytics