20

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

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

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

它将在浏览器和Node.js中运行。

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

我读过文章JavaScript 中的分号是可选的。它说它应该工作。

4

5 回答 5

25

我个人是一个支持分号的人,但是对于替代方案有一个令人信服的论据,通常没有给出公平的声音。与所有编码风格的争论一样,这将是一场永无止境的辩论,没有合理的结论。做你和你的团队觉得更舒服的事情。

如果您确实采用节俭的分号方法,请确保您和您的团队正确理解自动分号插入(ASI) 和语句终止规则。无论您做出什么决定,这绝对是一件好事。

关于缩小:如果你不想冒一个缩小器错误的潜在头痛以及报告和修复它(或等待修复)的相关负担,因为它没有正确执行 ASI,那么不要依赖ASI。

于 2012-08-22T20:52:37.330 回答
5

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

  • 它使您的代码容易出现错误由于删除空格(用于缩小):试试这个:

    变量 a = 1; 变量 b = 7; var sum = a+b (a + b)

它缩小到var a=1,b=7,sum=a+b(a+b);,这将导致错误number is not a function。还有其他案例这个案例

更新:这个错误不是由缩小引起的,但是,下一个是:

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

      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,试试CoffeeScript。但也有一些误导性的观念,他们认为“简单的解决方案:当一行以括号开头时,在其前面加上分号。”可以消除上述陷阱。这个干净的代码如何,它如何帮助任何人阅读你的代码?

底线:通过缩小,我肯定会尝试使用JSLint的约定。我已经看到一些人在尝试修复一个未在未缩小但在缩小代码中发生的错误数小时后,终于对他们的 JavaScript 代码进行了 linting。不要让自己陷入这种痛苦;分号乍一看可能很难看,但它们可以阻止错误。

于 2012-08-22T13:44:58.420 回答
3

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

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

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

于 2012-08-22T13:18:34.560 回答
0

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

如果你这样做,Douglas Crockford 不会喜欢你 :) JavaScript: The Good Parts

于 2012-08-22T13:14:57.913 回答
-2

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

于 2012-08-22T13:15:05.073 回答