在
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中作为语句的终止符,它的主要功能是作为语句的断言(End Of Statement, EOS),用来结束一个程序语句。尽管在很多C风格的语言中,分号的存在主要是为了简化编译器的设计,但现代编译器已能够高效地...
在JavaScript编程中,自动分号插入(Automatic Semicolon Insertion,ASI)是一个重要的语法规则。理解这一机制对于编写符合ECMAScript标准的代码至关重要。下面将围绕这个话题详细探讨相关的知识点。 首先,...
总结起来,在现代JavaScript编程实践中,虽然省略分号在很多情况下是安全的,但为了避免代码压缩或合并时的潜在问题,合理地使用分号仍然非常重要。特别是当你处理多个文件合并和代码压缩的场景时,分号的使用可以...
JavaScript中语句后的分号是编程中的一个关键语法元素,因为JavaScript的自动分号插入规则可能导致代码执行行为不符合程序员的预期。了解这些规则,可以帮助开发者写出更加准确和可靠的代码。 首先,了解JavaScript...
在本文中,我们将深入探讨“分号带来的错误”这一主题,特别是在计算1到100以内奇数之和的程序中可能出现的问题。 首先,让我们分析问题的背景。在计算1到100以内所有奇数的和时,我们通常会用到循环结构,如for或...
最后,编程风格章节强调了JavaScript编程中的风格问题,包括语法标记的风格和语句的编写方式。这包括了大括号的位置、圆括号的使用、缩进、行尾分号以及代码块的组织等。好的编程风格能够使代码更易读、易维护。 总...
第15周-第21章节-Python3.5-javascript必须加分号.avi
普元EOS,作为一款企业级的服务治理平台,提供了解决这一问题的组件——普元EOS跨域组件。这个组件的出现,旨在帮助开发者克服浏览器的安全限制,实现不同源之间数据的交互。 **一、什么是普元EOS?** 普元EOS...
《Effective JavaScript:编写高质量JavaScript代码的68个有效方法》是David Herman撰写的一本JavaScript编程指南,该书基于作者在Ecma的JavaScript标准化委员会的工作经验,深入探讨了JavaScript的内部工作机制、...
JavaScript语句是向浏览器发出的命令,每个语句以分号`;`结尾。例如,`alert("hello!");`就是一个简单的语句,它会弹出一个对话框显示“hello!”。在编写代码时,良好的编程习惯是使用分号,尽管它们在某些情况下...
此外,一些JavaScript插件开发者在代码的第一行添加一个分号,目的是为了防止可能由于插件使用者的代码风格不同导致的问题。如果后续的脚本中省略了分号,且与之前的代码有语义上的联系,可能会引起解析错误或者意外...
尽管掌握HTML、JavaScript、Java、JSP、Jsp Tag、XML、XPath、SQL等J2EE基础知识和独立安装数据库软件的能力有助于深入学习EOS,但这并非硬性要求。教程采取了案例驱动的方式,以实例为基础,逐步引导读者掌握EOS的...
在这个场景中,我们关注的是VS2015的安装过程中涉及到的证书问题以及两个特定的组件:JavaScript_ProjectSystem.msi和JavaScript_LanguageService.msi。 首先,关于“VS2015安装证书”,这通常是指安装过程中需要...
此外,RichWeb部分可能涉及到如何利用EOS创建富客户端体验,这可能包括使用Ajax技术实现页面无刷新更新,使用JavaScript库(如jQuery或Vue.js)增强交互性,或者利用CSS3和HTML5特性提供更丰富的视觉效果。...
JavaScript,简称JS,是由Brendan Eich在1995年创造的一种高级编程语言,最初目的是为了增强网页的交互性,特别是在前端进行表单验证。JavaScript不是Java的子集,两者之间没有直接关联。JS起初名为LiveScript,但在...
JavaScript 语源问题剖析 本文旨在厘清 JavaScript 语源问题中存在的误解和谬见,通过大量的图片资料和实际例证,证实了几个鲜为人知的 JavaScript 语源问题。 首先,本文指出,Nombas 公司的 Espresso Pages 并不...
本书是一本全面、深入介绍JavaScript语言的学习指南。本书共分四个部分,第1部分帮助读者快速入手,掌握基本的JavaScript编程要点;第2部分介绍JavaScript的发展和技术背景;第3部分深入探索JavaScript,介绍了语法...
《JavaScript语言精粹》作为一本深入浅出讲解JavaScript编程语言的经典之作,对于想要提升自己JavaScript技能的开发者来说,无疑是一份宝贵的资源。本书由Douglas Crockford所著,他不仅是JSON格式的创始人,也是...
例如,不同浏览器可能对某些JavaScript特性有不同的实现方式,这可能导致跨浏览器的问题。此外,JavaScript的安全漏洞也可能被恶意利用,例如跨站脚本(XSS)攻击。 **JavaScript开发工具**包括各种编辑器和IDE...