JavaScript分号的代码风格和缩小?
我正试图决定是否值得使用JavaScript分号的样式。
如果我有没有分号的JavaScript代码:
function(){ var first = 1 var second = 2 sum = 1 + 2 return sum }
它将在浏览器和Node.js中工作 。
但是会缩小(通过Uglify或Closure Compiler )在浏览器和Node.js中的代码工作?
我读过的文章JavaScript中的分号是可选的 。 它说它应该工作。
我个人是一个亲分号的人,但是对于另一个人来说,有一个引人注目的观点,而这个观点往往没有得到公正的发言 。 与所有的编码风格的论点一样,这将是一个永无止境的辩论,没有合理的结论。 做你和你的团队感觉更舒适。
如果您确实需要采用节约分号的方法,请确保您和您的团队正确理解自动分号插入 (ASI)和语句终止规则。 理解你的决定绝对是一件好事。
关于缩小:如果你不想冒风险的潜在的麻烦和一个缩小的错误报告和修复它(或等待修复)的负担,因为它没有正确地执行ASI,那么不要依靠ASI。
- Isaacs( Node.js的维护者,因此就这个问题而言,minification是不可知的)
- 他build议对ASI规则进行出色的公正分析
尽pipeJavaScript中的分号是可选的,但强烈build议不要使用分号:
-
它使你的代码容易受到bug的影响
删除空白(用于缩小):尝试这个:var a = 1; var b = 7; var sum = a + b(a + b)
它缩小为 这将导致错误var a=1,b=7,sum=a+b(a+b);
, number is not a function
。 还有其他的情况和这种情况 。
更新 :这个bug并不是由缩小造成的,但是下一个是:
-
它使你的代码易受由于缩小而产生的错误的影响:Try:
var isTrue = true function doSomething() { return 'yeah' } function doSomethingElse() { return 'yes, dear' } doSomething() !isTrue && doSomethingElse()
缩小到:
var isTrue=true;function doSomething(){return "yeah"}function doSomethingElse(){return "yes, dear"}doSomething()!isTrue&&doSomethingElse();
这导致:
SyntaxError: Unexpected token !
-
它使得你的代码在便利性方面的可读性和可维护性都得到了提高:使用分号已经被正确地build立为良好的实践,而受过训练的JavaScript开发者将会被代码困惑以逃避惯例。
另一件事是,你必须问自己:你真的省略了分号?
- 清洁代码? 如果您希望JavaScript看起来不像JavaScript,请尝试使用Coffee Script 。 但是也有一些误导的概念 ,认为像上面提到的那样的缺陷可以通过“简单的解决scheme:当一行以括号开始,在其前面加上一个分号”来清除。 这个干净的代码如何,以及如何帮助任何人阅读您的代码?
底线:随着缩小,我一定会尝试使用JSLint的约定 。 我已经看到一些人终于在经过几个小时的努力修复一个没有发生在unminified,但在缩小的代码错误的lincode他们的JavaScript代码。 不要把自己陷入这种苦难之中; 分号可能一见难看,但它们保持了错误。
不要这样做。 分号插入是非常危险的事情。 规模的增加不值得追加风险。
杜拉斯·克罗克福德不会喜欢你,如果你这样做:) http://youtu.be/hQVTIJBZook
编译器和限制器可能足够聪明,可以根据需要添加分号(以及是否有助于缩小过程)。
然而! 分号告诉解释者,这是一个声明的结尾。 如果缺失,则必须查看下一行的开头,以确定该陈述是否有意义。 然后,它会决定,如果下一行是一个新的语句(即分号丢失),或者它实际上是从前一行的语句的延续。
没有分号,你放慢了速度! 更何况,这可能会引起一些模糊的错误,当解释者,执行我描述的algorithm,决定错误!
恕我直言,不要那样做。 你不会真的获得这么多的分号,AFAIK自动放置在那里,它可以放在一个地方,它会产生怪异的错误。