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自动放置在那里,它可以放在一个地方,它会产生怪异的错误。