扯不完的 JS 分号问题
编者按:本文由 mihan 发表于掘金,已授权奇舞周刊转载。
无论哪个团队,代码风格统一的争论是一个无解的话题,每次争论起来,各有各理,或执着或偏激或丧心病狂拍桌愤然离去 :)
如果团队强制性用了一种代码风格后,符合自己心中标准的同学,欣然乐嘻嘻;不符合的可能会心中『圈养』草泥马暗然敲码;最厉害的情况是,自己之前写的代码在团队流程工具统一编译代码的时候被暗中格式化了,此时心中就不再是一圈草泥马了,至少是一个动物公园。
我们之所以为代码风格统一争论,因为大家都知道良好代码风格的重要性:专业、可维护,提高团队协作效率。
然而,鄙人在不同的争论会上以及网上各门各派的精彩舌战中暗中观察发现,某些代码风格支持者的支持理由看上去似乎并不是基于这个『重要性』或其更本质的观点提出,而更像为自己贴上『个性代码』、『流行语言风格』、『我不喜欢』等标签,如 JavaScript 分号大战中,某乎上的一些『semicolon less』支持者观点:
先看看最近一两年最 Hit 的尤雨溪大人:
大 V 尤很介怀没有深入去了解 ASI 机制就发表哪种好哪种不好的同学,而似乎更倾向将流行语言风格作为参考标准。
个人觉得并不是很有说服力,因为很容易让我想到一个打比方:2012年西班牙的传控踢法所向披靡,惊艳世界足坛,难道追求简单实用的德国队就一定要跟着踢传控球才能说明自己是一支很优秀的球队了吗?说不通。
再来看看从 2012 年纠结到 2014 年的贺老湿:
用了很长很长的篇幅去回答,老湿这精神值得我们去学习。但是,老湿似乎是在放大加分号的各种缺点,然后给自己理由作出平衡,然后作出选择。
我似乎同样也不能接受这样的理由,因为在实际编码中,如果养成良好的编码习惯,他所列的 1,2,3 缺陷根本不是问题。
其他一些观点,很多都是随着自己的喜爱随性提出,如:
那有没有实在一点的观点?有的,玉伯大神的:
很佛系很务实的答案是不是。实际工作中,就应该这样,懂得『执生』,懂得尊重,为玉伯点 Like。可惜,这并不是一个可以说服你用还是不用分号的答案。
引发这些争论,无非是风格问题,风格的东西,必定是个人偏爱的东西,围着风格去讨论,永远都是口水战,没有结果。
所以,难道这个『分号问题』真的只是风格的问题?
引发分号的争论问题,ASI 机制是最直接原因,那么去了解为何会产生 ASI 是最容易着手的,而最捷径的方法,就是去看看 JavaScript 的发明者 Brenden Eich 对这个问题的看法。正好有一篇文章就是他在 2012 年专门对这个问题发表的,The infernal semicolon(套路深)
文章开头第一句就放了狠话
这个争论的标题是『bootstrap-dropdown.js clearMenus() needs ; at the end』,引发争论的代码如下:
clearMenus()
!isActive && $parent.toggleClass('open')
有人指出当时的 JSMin 有bug,压缩上面的代码会出错。
这时候,JSON、JSLint、JSMin 和 ADSafe 的创造者、ECMA JavaScript 2.0 标准化委员会委员、被 JavaScript 之父Brendan Eich 称为 JavaScript 的大宗师、名著《JavaScript: The Good Parts》(中文版《JavaScript语言精粹》)的作者(来头有点凶)Douglas Crockford 直接怼之:
Brendan Eich 对 Douglas Crockford 的回答以及强硬的态度婉转表示赞同的同时,也保留了自己看法,大致思路如下:
用了不短的篇幅谈了设计 ASI 的初衷:
『句法错误纠正的程式』,我理解就是一个容错方案,并不是一个语法规则!换个说法就是,我(当然是Brendan Eich)发明这个语言的时候,在语法上明确说明,一个句子的结束应该以『;』号作为结束,但是你们的编码风格实在不可控,有可能会出现漏写分号,为了防止你们在编码过程中由于个人原因忘记加『;』号而造成错误,所以我加上 ASI 这个机制,尽可能地让代码能正常地运行下去!
这似乎是作者当年的一番好意,如今却成了一个争论的话题,这并不是作者希望看到的,对这个现象,作者对 ASI 的设计表现出一丝丝悔意:
但是从语言设计者的角度考虑,ASI 的存在似乎也是合理的,作者认为,一个编程语言在编码风格自由度的把控并不可控,ASI 的设计可以让其有更大的自由度:
最后,作者给了一个明确的观点:
而站在语言设计者的角度,对语言自由度的把控,作者也表达了自己的态度:
大致意思是,如果作者是 Douglas Crockford,纵观 JS 的微妙而长远的发展史,作者会修复 JSMin,但如果碰到 Douglas Crockford 所指的傻X代码,作者仍然会第一个站出来先怒怼几句!
我们用自己的话来整理一下作者(下文的我)的观点:
ASI 是一个句法错误纠正的程式,是我对语言设计自由度把控的态度
很不幸,ASI 却燃起了 JS 是否加分号编码风格争论战火,粉丝们过激的行为使我感到很 Sad
为此我感到后悔,希望自己在 95 年 5 月份的 10 多天设计时间里可以让 JS 的断句意义显得更为重要!
但是我是一个很有态度的语言设计者,ASI 从语言设计角度上给予了语言更大的自由度,从这个层面上说,ASI 并没有错!
继续但是,可以正常撸通代码的情况下我还是不建议使用 ASI,毕竟 ASI 的设计是用来处理句法错误纠正的
对于不尊重语言语法规范的傻 X 代码我依然会怒怼几句,但是对语言设计自由度把控的态度我还是会坚持,所以我尊敬的大神 Douglas Crockford,如果我是你,我还是会怒怼傻 X 代码的,但同时我会修复 JSMin 以表作为一个语言设计者应有的态度。
OK,锤观国内精彩的『分号大战』,我也表达自己的两个观点:
撸码你可以我型我 show,但你首先得尊重语言本身;
不要太迷信大 V 大神,应该要有自己的考究和判断;
所以最后分号是加还是不加?
我
对天发誓,我
你们自己看着办吧:)
关于奇舞周刊
《奇舞周刊》是360公司专业前端团队「奇舞团」运营的前端技术社区。关注公众号后,直接发送链接到后台即可给我们投稿。