JavaScript不带分号的代码风格和缩小?

时间:2012-08-22 13:12:20

标签: javascript node.js

我正在尝试决定是否值得使用JavaScript无分号样式。

如果我有没有分号的JavaScript代码:

function(){
    var first = 1
    var second = 2
    sum = 1 + 2
    return sum
}

它可以在浏览器和Node.js中使用。

但是会缩小(通过Uglify或Closure Compiler)代码在浏览器和Node.js中工作吗?

我已阅读文章 Semicolons in JavaScript are optional 。它说它应该有效。

5 个答案:

答案 0 :(得分:25)

我个人是一个支持分号的家伙,但是替代方案有一个令人信服的论据,通常不是given a fair voice。与所有编码风格的论点一样,这将是一场永无止境的辩论,没有合理的结论。做你和你的团队感觉更舒服的事情。

如果您采用节俭的分号方法,请确保您和您的团队正确理解automatic semicolon insertion(ASI)和语句终止规则。无论你的决定是什么,这都是一件好事。

关于缩小:如果你不想冒一个minifier bug的潜在头痛的风险以及报告和修复它(或等待修复)的相关负担,因为它没有正确地进行ASI,那么就不要依靠ASI。

答案 1 :(得分:6)

尽管JavaScript中的分号是可选的,但强烈建议不要使用分号:

  • 它使您的代码容易受到因删除空格而导致的错误的影响(用于缩小):试试这个:

    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。还有other casesthis case

更新:此错误不是由缩小造成的,但下一个是:

  • 它使您的代码容易受到缩小导致的错误的影响:尝试:

    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 !
    
  • 它使您的代码在方便性方面的可读性和可维护性降低:使用分号已被正确地建立为良好实践,并且训练有素的JavaScript开发人员会被试图逃避约定的代码所迷惑。

另一件事是,你必须问自己:你真正得到的是省略分号?

  • 清洁代码?如果您希望JavaScript看起来不像JavaScript,请尝试Coffee Script。但是有some misguided notions,它认为像上面提到的那样的陷阱被“简单的解决方案清除:当一条线以括号开头时,在它前面加一个分号。”。这个干净的代码怎么样,这对帮助读取代码的人有什么帮助?

底线:通过缩小,我肯定会尝试使用JSLint的约定。我看到有些人在经过几个小时的尝试修复一个没有发生错误的错误,但是在缩小的代码中,最终会发现他们的JavaScript代码。不要把自己置于这种苦难之中;分号一见钟情可能很难看,但是它们可以防止错误。

答案 2 :(得分:2)

编译器和缩放器可能足够智能,可以根据需要添加分号(如果它有助于缩小过程)。

然而!分号告诉解释器这是语句的结束。如果它丢失了,它必须查看下一行的开头,以确定该语句是否有意义继续。然后它将决定,如果下一行是一个新语句(即分号丢失),或者它实际上是前一行语句的延续。

没有分号,你放慢了速度!更不用说当执行我描述的算法的解释器决定错误时,这可能会引入一些模糊的错误!

答案 3 :(得分:1)

不要这样做。分叉插入是一件非常危险的事情。尺寸增加不值得增加风险。

如果你这样做,杜拉斯克罗克福德不会喜欢你:) http://youtu.be/hQVTIJBZook

答案 4 :(得分:-1)

恕我直言,不要这样做。你并没有真正获得那么多,分号是自动放置在那里的AFAIK,它可以放在一个会产生奇怪错误的地方。