在
http://bbs.51js.com/viewthread.php?tid=83937&extra=page%3D1&page=1的讨论中,月影分析了JavaScript中EOS(End of Statement)存在的歧义问题。下面是我的回应。
是否要写“;”呢?
我经过几次反复。最开始是随便,想写就写。
后来都不写。
后来有段时间都写。
现在又都不写。
基本上现在的结果是我最后定型的习惯了。
原因:
1. 程序如果不追求太紧凑(例如要把多个语句写到一行里),分号确实是可以不用的。而且强制自己不用分号,其实是强制自己不要使用紧凑风格。
2. c-style的分号本来就是多余的。为什么这么说?因为明确的EOS只是给编译器的提示而已。而如果漏了分号,编译器会报错。既然它都报错了,显然它知道这里应该有EOS。既然它知道,那么干嘛还要我写?
某人说:【No expert programmers *hate* the situation in which the compiler throws out the program because of a missing semicolon. They ask the very reasonable question "if the compiler knows there should be a semicolon there why the **** doesn't it put it in?"】
所以明确的EOS只是给编译器的hint而已。这在几十年前是一个平衡编译器和用户成本的设计。但是放到现在,就未必了。JS以及许多语言的可选分号或可选EOS,其实就是一种回归。
3. 但是JS的严重问题是,它要兼顾(主要是兼顾从java那里继承下来的c-style的跨行语句习惯)。所以分号自动插入算法导致的实际结果是:EOS可能是分号,也可能是换行。麻烦的是,换行不一定是EOS。换行是否是EOS要看这一行和下一行结合起来。如果加上点括号啊,注释之类的,那到底EOS在哪里就头大了。
4. 所以问题仍然和最初类似,现行的JS的EOS规则,是为编译器(JS解释器)设计的(尽管初衷是为人的方便),而不是为“人”设计的。
5. 一个可供比较的例子是Groovy。它也是允许不写分号的。但是它的规则更好。基本不太会出现很难判断一个换行是否是EOS的例子。参见我的老文章:
Groovy在EOS问题上的痛苦权衡
6. 本身js的规则也不能说太差,但是最让人反感的,是对括号的处理。也就是月影所举的一系列例子。假如不是因为对于括号处理的
愚蠢设计,js的分号处理完全是可以接受的。
7. 所以如果像我一样,完全不写分号,就必须做到不在语句开始使用“(” 、“[”和其他歧义符号(如“+/-”)。这种情况本来也是比较少的。如对于(function...)的惯例法,可用void function或者new function来替代。
8. 其实出现歧义的情形,后续语句都是一个被丢弃结果的表达式(有例外的情形吗?),所以基本上可以在语句开始加上void运算符来明确,并且消除歧义。当然,更简单的方法是在引起歧义的语句之前(而不是之后)加上“;”。
总之,现在的状况是js的设计失误,如果没有工具支持(比如预处理器来补上“;”),那么从最佳实践的角度出发,就两种选择:
1. 月影的做法
每个语句之后写“;”
优点:作为规范,描述起来比较简单
缺点:老是要写烦人的“;”
陷阱:要记得,function表达式后面也要写“;”
另外,应该尽量避免写出有歧义的跨行语句,因为很难判断是有意为之,还是忘记写“;”。
2. 偶的做法
采用更严格的跨行策略,即只允许在当前行处于未完成状态时跨行(就像你在jsshell中输入代码一样)。
对于可能引起歧义的语句(行首为(、[、+/-等),在句首加上 void 或 “;”。
优点:省略了很多无聊的“;”
养成更良好的跨行代码习惯(适用于所有c-style的语言)
更容易应用工具(比如预处理器可以扫描出所有有问题的行,而对于传统的行尾加分号,工具只能warning,因为无法判断到底是有意跨行,还是忘记写“;”)
缺点:要判断歧义语句,另外在语句首加上void或“;”有点难看
陷阱:暂时没有发现
分享到:
相关推荐
JavaScript 中的分号是可选的,加不加分号主要是个代码风格问题。一种风格是使用分号明确结束语句,即便这些分号不是必需的;另一种风格是尽可能的不加分号,只在必要的情况才加。我个人就不喜欢加分号,当然喜欢...
javascript大括号后面应使用分号吗?JS中function 的开头有加感叹号、分号是什么意思呢? Js多个文件集成成一个文件后,压缩代码时避免发生语法错误,可以如下处理 一、js 前加分号 例如:;(function($){…此处...
javascript每条语句都是以分号结束,但由于javascript具有分号自动插入规则,所有不同的编程人员有不同的习惯,有的加分号,有的不加分号,那么到底加分号好还是不加分号好?本文章向大家探讨javascript每条语句该不...
在 JavaScript 中,行尾的分号有一种自动插入机制,这样子,可以容忍某些朋友忽略了输入分号。 当然你最好养成输入分号的习惯,同时掌握 JavaScript 是如何处理忽略输入分号的情况的,因为这种知识有助于你理解没有...
下面通过本文给大家详细介绍javascript中的语句后面的分号问题,本文给大家介绍的非常详细,需要的朋友参考下吧
javascript一些问题解答 javascript一些问题解答
第15周-第21章节-Python3.5-javascript必须加分号.avi
EOS RichWeb由ide开发环境、标签库和Javascript api三部分组成。 ide开发环境 ide开发环境包括了jsp编辑器、工具面板和属性视图。 标签库 EOS RichWeb共提供了6大类的标签: Bean类:用于把数据区、Cookie、...
javascript弹出窗口问题总结 1.无提示刷新网页 2.javascript刷新页面的方法 3.javascript弹出窗口代码 4.模式窗口数据不刷新(缓存)问题 5.模式窗口中,链接弹出新窗口问题 6.无提示关闭页面的方法
今天在看《Extjs中文手册》的时候,写了四五行样例代码,结果IE和Firefox一直报错不通过。
javascript特效javascript特效javascript特效javascript特效javascript特效javascript特效javascript特效javascript特效
数据结构课程设计作业-基于Vue和JavaScript实现约瑟夫问题可视化演示源码.zip数据结构课程设计作业-基于Vue和JavaScript实现约瑟夫问题可视化演示源码.zip数据结构课程设计作业-基于Vue和JavaScript实现约瑟夫问题...
javascript内存泄露问题的解析 javascript内存泄露问题的解析javascript内存泄露问题的解析
您需要了解HTML、Javascript、Java、JSP、JspTag、SQL等J2EE的基本知识,并且对《EOS基础教程》有一定的理解,这将为您能更好的学习本文档起到事半功倍的效果。 本文档讲通过几个案例来引导读者运用primeton EOS ...
本书是一本全面、深入介绍JavaScript语言的学习指南。本书共分四个部分,第1部分帮助读者快速入手,掌握基本的JavaScript编程要点;第2部分介绍JavaScript的发展和技术背景;第3部分深入探索JavaScript,介绍了语法...
这是一个关于处理javascript的国际化问题的一篇技术文章。